authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-01-27 15:54:11+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-01-30 15:20:16+02:00
logb129350cb5de2251d50b142a50d8d74ccd92ae73
tree9c293f26ae3b6f310262b00b85cd5e993ea745d6
parentdd300d47b22c740ab75ace54057a3831606f7952

AstGen: fix crash on invalid decltest

Closes #14476

2 files changed, 41 insertions(+), 1 deletions(-)

src/AstGen.zig+28-1
...@@ -4278,7 +4278,34 @@ fn testDecl(...@@ -4278,7 +4278,34 @@ fn testDecl(
4278 var num_namespaces_out: u32 = 0;4278 var num_namespaces_out: u32 = 0;
4279 var capturing_namespace: ?*Scope.Namespace = null;4279 var capturing_namespace: ?*Scope.Namespace = null;
4280 while (true) switch (s.tag) {4280 while (true) switch (s.tag) {
4281 .local_val, .local_ptr => unreachable, // a test cannot be in a local scope4281 .local_val => {
4282 const local_val = s.cast(Scope.LocalVal).?;
4283 if (local_val.name == name_str_index) {
4284 local_val.used = test_name_token;
4285 return astgen.failTokNotes(test_name_token, "cannot test a {s}", .{
4286 @tagName(local_val.id_cat),
4287 }, &[_]u32{
4288 try astgen.errNoteTok(local_val.token_src, "{s} declared here", .{
4289 @tagName(local_val.id_cat),
4290 }),
4291 });
4292 }
4293 s = local_val.parent;
4294 },
4295 .local_ptr => {
4296 const local_ptr = s.cast(Scope.LocalPtr).?;
4297 if (local_ptr.name == name_str_index) {
4298 local_ptr.used = test_name_token;
4299 return astgen.failTokNotes(test_name_token, "cannot test a {s}", .{
4300 @tagName(local_ptr.id_cat),
4301 }, &[_]u32{
4302 try astgen.errNoteTok(local_ptr.token_src, "{s} declared here", .{
4303 @tagName(local_ptr.id_cat),
4304 }),
4305 });
4306 }
4307 s = local_ptr.parent;
4308 },
4282 .gen_zir => s = s.cast(GenZir).?.parent,4309 .gen_zir => s = s.cast(GenZir).?.parent,
4283 .defer_normal, .defer_error => s = s.cast(Scope.Defer).?.parent,4310 .defer_normal, .defer_error => s = s.cast(Scope.Defer).?.parent,
4284 .namespace, .enum_namespace => {4311 .namespace, .enum_namespace => {
test/cases/compile_errors/invalid_decltest.zig created+13
...@@ -0,0 +1,13 @@
1export fn foo() void {
2 const a = 1;
3 struct {
4 test a {}
5 };
6}
7
8// error
9// backend=stage2
10// target=native
11//
12// :4:14: error: cannot test a local constant
13// :2:11: note: local constant declared here