aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-11-15 16:50:20 +0200
committerVeikka Tuominen <git@vexu.eu>2022-11-16 01:12:28 +0200
commitfb09093d95f2dc9bf454ba0d1d489316311adffc (patch)
treed033652857b160b2862c935fbd498a9f5aa7dfec
parent2cfa7165e715321dffea21380d4fde0dd5079925 (diff)
downloadzig-fb09093d95f2dc9bf454ba0d1d489316311adffc.tar.gz
zig-fb09093d95f2dc9bf454ba0d1d489316311adffc.zip
Module: call `ensureDeclAnalyzed` on `builtin.test_functions`
Previously the compiler would crash on branching on undefined values if you tried using `zig test` with a freestanding target since there was no start code referencing `builtin.test_functions`. Closes #12554
-rw-r--r--src/Compilation.zig2
-rw-r--r--src/Module.zig16
2 files changed, 16 insertions, 2 deletions
diff --git a/src/Compilation.zig b/src/Compilation.zig
index 35be4e86cf..73db9f5e97 100644
--- a/src/Compilation.zig
+++ b/src/Compilation.zig
@@ -2361,7 +2361,7 @@ pub fn update(comp: *Compilation) !void {
// The `test_functions` decl has been intentionally postponed until now,
// at which point we must populate it with the list of test functions that
// have been discovered and not filtered out.
- try module.populateTestFunctions();
+ try module.populateTestFunctions(main_progress_node);
}
// Process the deletion set. We use a while loop here because the
diff --git a/src/Module.zig b/src/Module.zig
index 3f061491c1..af29a591cc 100644
--- a/src/Module.zig
+++ b/src/Module.zig
@@ -6431,13 +6431,27 @@ pub fn processExports(mod: *Module) !void {
}
}
-pub fn populateTestFunctions(mod: *Module) !void {
+pub fn populateTestFunctions(
+ mod: *Module,
+ main_progress_node: *std.Progress.Node,
+) !void {
const gpa = mod.gpa;
const builtin_pkg = mod.main_pkg.table.get("builtin").?;
const builtin_file = (mod.importPkg(builtin_pkg) catch unreachable).file;
const root_decl = mod.declPtr(builtin_file.root_decl.unwrap().?);
const builtin_namespace = root_decl.src_namespace;
const decl_index = builtin_namespace.decls.getKeyAdapted(@as([]const u8, "test_functions"), DeclAdapter{ .mod = mod }).?;
+ {
+ // We have to call `ensureDeclAnalyzed` here in case `builtin.test_functions`
+ // was not referenced by start code.
+ mod.sema_prog_node = main_progress_node.start("Semantic Analysis", 0);
+ mod.sema_prog_node.activate();
+ defer {
+ mod.sema_prog_node.end();
+ mod.sema_prog_node = undefined;
+ }
+ try mod.ensureDeclAnalyzed(decl_index);
+ }
const decl = mod.declPtr(decl_index);
var buf: Type.SlicePtrFieldTypeBuffer = undefined;
const tmp_test_fn_ty = decl.ty.slicePtrFieldType(&buf).elemType();