aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-10-03 22:46:22 -0400
committerGitHub <noreply@github.com>2022-10-03 22:46:22 -0400
commit54eb0f2daa2cf5237da05e3cfad5800b9ccf424e (patch)
treedd1eb2e1a9a936a6d48bacff436a4ded191ffb34 /src/Sema.zig
parent8eb96c32e38d687c2b2f1488105538dda8dd5b0b (diff)
parent9cad44770a15d189cddb749bc1b2fca9e24b858f (diff)
downloadzig-54eb0f2daa2cf5237da05e3cfad5800b9ccf424e.tar.gz
zig-54eb0f2daa2cf5237da05e3cfad5800b9ccf424e.zip
Merge pull request #13032 from jacobly0/br-on-undef-val
stage2: fix branches on undefined values
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index d580397a50..eb46e7481a 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -8107,6 +8107,13 @@ fn funcCommon(
for (comptime_params) |ct| is_generic = is_generic or ct;
is_generic = is_generic or ret_ty_requires_comptime;
+ if (!is_generic and sema.wantErrorReturnTracing(return_type)) {
+ // Make sure that StackTrace's fields are resolved so that the backend can
+ // lower this fn type.
+ const unresolved_stack_trace_ty = try sema.getBuiltinType(block, ret_ty_src, "StackTrace");
+ _ = try sema.resolveTypeFields(block, ret_ty_src, unresolved_stack_trace_ty);
+ }
+
break :fn_ty try Type.Tag.function.create(sema.arena, .{
.param_types = param_types,
.comptime_params = comptime_params.ptr,
@@ -15631,7 +15638,7 @@ fn zirRetLoad(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Zir
return sema.analyzeRet(block, operand, src);
}
- if (sema.wantErrorReturnTracing()) {
+ if (sema.wantErrorReturnTracing(sema.fn_ret_ty)) {
const is_non_err = try sema.analyzePtrIsNonErr(block, src, ret_ptr);
return retWithErrTracing(sema, block, src, is_non_err, .ret_load, ret_ptr);
}
@@ -15698,11 +15705,11 @@ fn retWithErrTracing(
return always_noreturn;
}
-fn wantErrorReturnTracing(sema: *Sema) bool {
+fn wantErrorReturnTracing(sema: *Sema, fn_ret_ty: Type) bool {
// TODO implement this feature in all the backends and then delete this check.
const backend_supports_error_return_tracing = sema.mod.comp.bin_file.options.use_llvm;
- return sema.fn_ret_ty.isError() and
+ return fn_ret_ty.isError() and
sema.mod.comp.bin_file.options.error_return_tracing and
backend_supports_error_return_tracing;
}
@@ -15754,7 +15761,7 @@ fn analyzeRet(
try sema.resolveTypeLayout(block, src, sema.fn_ret_ty);
- if (sema.wantErrorReturnTracing()) {
+ if (sema.wantErrorReturnTracing(sema.fn_ret_ty)) {
// Avoid adding a frame to the error return trace in case the value is comptime-known
// to be not an error.
const is_non_err = try sema.analyzeIsNonErr(block, src, operand);