aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2023-05-11 12:23:39 +0300
committerVeikka Tuominen <git@vexu.eu>2023-05-11 17:23:06 +0300
commit0958d5d7db24222bdcc0fb8e8cdc9838953b9857 (patch)
tree21569090326a60c510deaa3fc549237d8b080ffc /src
parentc0102ac1c89db1727d7c58d566376a6a79af4e98 (diff)
downloadzig-0958d5d7db24222bdcc0fb8e8cdc9838953b9857.tar.gz
zig-0958d5d7db24222bdcc0fb8e8cdc9838953b9857.zip
Sema: fix crash when generating anon name on invalid code
Closes #15615
Diffstat (limited to 'src')
-rw-r--r--src/Sema.zig11
-rw-r--r--src/print_air.zig1
2 files changed, 7 insertions, 5 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 2521bddce0..a3502726bb 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -2730,9 +2730,13 @@ fn createAnonymousDeclTypeNamed(
for (fn_info.param_body) |zir_inst| switch (zir_tags[zir_inst]) {
.param, .param_comptime, .param_anytype, .param_anytype_comptime => {
const arg = sema.inst_map.get(zir_inst).?;
- // The comptime call code in analyzeCall already did this, so we're
- // just repeating it here and it's guaranteed to work.
- const arg_val = sema.resolveConstMaybeUndefVal(block, .unneeded, arg, "") catch unreachable;
+ // If this is being called in a generic function then analyzeCall will
+ // have already resolved the args and this will work.
+ // If not then this is a struct type being returned from a non-generic
+ // function and the name doesn't matter since it will later
+ // result in a compile error.
+ const arg_val = sema.resolveConstMaybeUndefVal(block, .unneeded, arg, "") catch
+ return sema.createAnonymousDeclTypeNamed(block, src, typed_value, .anon, anon_prefix, null);
if (arg_i != 0) try buf.appendSlice(",");
try buf.writer().print("{}", .{arg_val.fmtValue(sema.typeOf(arg), sema.mod)});
@@ -6562,7 +6566,6 @@ fn analyzeCall(
) CompileError!Air.Inst.Ref {
const mod = sema.mod;
-
const callee_ty = sema.typeOf(func);
const func_ty_info = func_ty.fnInfo();
const fn_params_len = func_ty_info.param_types.len;
diff --git a/src/print_air.zig b/src/print_air.zig
index d90d31ec67..6ed2e48bbc 100644
--- a/src/print_air.zig
+++ b/src/print_air.zig
@@ -917,7 +917,6 @@ const Writer = struct {
try s.writeAll("\n");
try s.writeByteNTimes(' ', old_indent);
- try s.writeAll("}");
}
fn writeWasmMemorySize(w: *Writer, s: anytype, inst: Air.Inst.Index) @TypeOf(s).Error!void {