authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2022-10-01 04:01:35-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2022-10-01 04:02:09-04:00
log8b66443d5008be91756c3c5567548ed18766ea11
tree166c32f3c7eeb9033a4d882036f29d717ed00cca
parentd9490a4340366818f91fac428981fe662d552ca6

llvm: avoid undefined values by ensuring the StackTrace decl is analyzed

The test builds an object file to prevent StackTrace from already having been analyzed by other code. Fixes #13030

4 files changed, 29 insertions(+), 0 deletions(-)

src/codegen/llvm.zig+1
......@@ -2335,6 +2335,7 @@ pub const Object = struct {
23352335 const stack_trace_decl = builtin_namespace.decls
23362336 .getKeyAdapted(stack_trace_str, Module.DeclAdapter{ .mod = mod }).?;
23372337
2338 mod.ensureDeclAnalyzed(stack_trace_decl) catch unreachable;
23382339 return mod.declPtr(stack_trace_decl).val.toType(undefined);
23392340 }
23402341};
test/standalone.zig+2
......@@ -97,4 +97,6 @@ pub fn addCases(cases: *tests.StandaloneContext) void {
9797 // Disabled due to tripping LLVM 13 assertion:
9898 // https://github.com/ziglang/zig/issues/12015
9999 //cases.add("tools/update_spirv_features.zig");
100
101 cases.addBuildFile("test/standalone/issue_13030/build.zig", .{ .build_modes = true });
100102}
test/standalone/issue_13030/build.zig created+18
......@@ -0,0 +1,18 @@
1const std = @import("std");
2const builtin = @import("builtin");
3const Builder = std.build.Builder;
4const CrossTarget = std.zig.CrossTarget;
5
6pub fn build(b: *Builder) void {
7 const mode = b.standardReleaseOptions();
8 const target = b.standardTargetOptions(.{});
9
10 const obj = b.addObject("main", "main.zig");
11 obj.setBuildMode(mode);
12
13 obj.setTarget(target);
14 b.default_step.dependOn(&obj.step);
15
16 const test_step = b.step("test", "Test the program");
17 test_step.dependOn(&obj.step);
18}
test/standalone/issue_13030/main.zig created+8
......@@ -0,0 +1,8 @@
1const std = @import("std");
2fn a() error{}!void {}
3fn b() std.meta.FnPtr(fn () error{}!void) {
4 return &a;
5}
6export fn c() void {
7 _ = b();
8}