Commit 0958d5d7db

Veikka Tuominen <git@vexu.eu>
2023-05-11 11:23:39
Sema: fix crash when generating anon name on invalid code
Closes #15615
1 parent c0102ac
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 {
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;
test/cases/compile_errors/struct_type_returned_from_non-generic_function.zig
@@ -0,0 +1,10 @@
+pub export fn entry(param: usize) usize {
+    return struct{ param };
+}
+
+// error
+// backend=stage2
+// target=native
+//
+// :2:12: error: expected type 'usize', found 'type'
+// :1:35: note: function return type declared here