authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-20 13:58:37+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-20 20:25:12+02:00
log9e276d32f3f8d980e4bf4c0a52df0fa97717aacb
tree05842a5d8694e59538d164771ddab648bcd898d8
parent9e7293619ffb26049af2248226a3d75ef274bfb0

Sema: fix memory management of missing field error

Closes #13590

2 files changed, 23 insertions(+), 4 deletions(-)

src/Sema.zig+5-4
...@@ -4111,6 +4111,7 @@ fn validateStructInit(...@@ -4111,6 +4111,7 @@ fn validateStructInit(
4111 .{fqn},4111 .{fqn},
4112 );4112 );
4113 }4113 }
4114 root_msg = null;
4114 return sema.failWithOwnedErrorMsg(msg);4115 return sema.failWithOwnedErrorMsg(msg);
4115 }4116 }
41164117
...@@ -4230,7 +4231,6 @@ fn validateStructInit(...@@ -4230,7 +4231,6 @@ fn validateStructInit(
4230 }4231 }
42314232
4232 if (root_msg) |msg| {4233 if (root_msg) |msg| {
4233 root_msg = null;
4234 if (struct_ty.castTag(.@"struct")) |struct_obj| {4234 if (struct_ty.castTag(.@"struct")) |struct_obj| {
4235 const fqn = try struct_obj.data.getFullyQualifiedName(sema.mod);4235 const fqn = try struct_obj.data.getFullyQualifiedName(sema.mod);
4236 defer gpa.free(fqn);4236 defer gpa.free(fqn);
...@@ -4241,6 +4241,7 @@ fn validateStructInit(...@@ -4241,6 +4241,7 @@ fn validateStructInit(
4241 .{fqn},4241 .{fqn},
4242 );4242 );
4243 }4243 }
4244 root_msg = null;
4244 return sema.failWithOwnedErrorMsg(msg);4245 return sema.failWithOwnedErrorMsg(msg);
4245 }4246 }
42464247
...@@ -17098,7 +17099,6 @@ fn finishStructInit(...@@ -17098,7 +17099,6 @@ fn finishStructInit(
17098 }17099 }
1709917100
17100 if (root_msg) |msg| {17101 if (root_msg) |msg| {
17101 root_msg = null;
17102 if (struct_ty.castTag(.@"struct")) |struct_obj| {17102 if (struct_ty.castTag(.@"struct")) |struct_obj| {
17103 const fqn = try struct_obj.data.getFullyQualifiedName(sema.mod);17103 const fqn = try struct_obj.data.getFullyQualifiedName(sema.mod);
17104 defer gpa.free(fqn);17104 defer gpa.free(fqn);
...@@ -17109,6 +17109,7 @@ fn finishStructInit(...@@ -17109,6 +17109,7 @@ fn finishStructInit(
17109 .{fqn},17109 .{fqn},
17110 );17110 );
17111 }17111 }
17112 root_msg = null;
17112 return sema.failWithOwnedErrorMsg(msg);17113 return sema.failWithOwnedErrorMsg(msg);
17113 }17114 }
1711417115
...@@ -27225,8 +27226,8 @@ fn coerceTupleToStruct(...@@ -27225,8 +27226,8 @@ fn coerceTupleToStruct(
27225 }27226 }
2722627227
27227 if (root_msg) |msg| {27228 if (root_msg) |msg| {
27228 root_msg = null;
27229 try sema.addDeclaredHereNote(msg, struct_ty);27229 try sema.addDeclaredHereNote(msg, struct_ty);
27230 root_msg = null;
27230 return sema.failWithOwnedErrorMsg(msg);27231 return sema.failWithOwnedErrorMsg(msg);
27231 }27232 }
2723227233
...@@ -27331,8 +27332,8 @@ fn coerceTupleToTuple(...@@ -27331,8 +27332,8 @@ fn coerceTupleToTuple(
27331 }27332 }
2733227333
27333 if (root_msg) |msg| {27334 if (root_msg) |msg| {
27334 root_msg = null;
27335 try sema.addDeclaredHereNote(msg, tuple_ty);27335 try sema.addDeclaredHereNote(msg, tuple_ty);
27336 root_msg = null;
27336 return sema.failWithOwnedErrorMsg(msg);27337 return sema.failWithOwnedErrorMsg(msg);
27337 }27338 }
2733827339
test/cases/compile_errors/missing_struct_field_in_fn_called_at_comptime.zig created+18
...@@ -0,0 +1,18 @@
1const S = struct {
2 a: u32,
3 b: comptime_int,
4 fn init() S {
5 return .{ .a = 1 };
6 }
7};
8comptime {
9 _ = S.init();
10}
11
12// error
13// backend=stage2
14// target=native
15//
16// :5:17: error: missing struct field: b
17// :1:11: note: struct 'tmp.S' declared here
18// :9:15: note: called from here