diff options
| author | Veikka Tuominen <git@vexu.eu> | 2022-10-24 17:30:47 +0300 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2022-10-27 01:31:18 +0300 |
| commit | 4ac8ec4c5c80f6eca0ac7d7955c5486ef55ce042 (patch) | |
| tree | 2c3c82f5531e65b74d34b003a8048956a04b873c | |
| parent | 4fc944dde813638410850515b0d1b156e5b6e920 (diff) | |
| download | zig-4ac8ec4c5c80f6eca0ac7d7955c5486ef55ce042.tar.gz zig-4ac8ec4c5c80f6eca0ac7d7955c5486ef55ce042.zip | |
AstGen: fix `ref`ing inferred allocs
Closes #13285
| -rw-r--r-- | src/AstGen.zig | 9 | ||||
| -rw-r--r-- | test/behavior.zig | 3 | ||||
| -rw-r--r-- | test/behavior/bugs/13285.zig | 11 |
3 files changed, 21 insertions, 2 deletions
diff --git a/src/AstGen.zig b/src/AstGen.zig index 07a972eaab..48e6a480f3 100644 --- a/src/AstGen.zig +++ b/src/AstGen.zig @@ -9709,7 +9709,7 @@ fn rvalue( const result_index = refToIndex(result) orelse return gz.addUnTok(.ref, result, src_token); const zir_tags = gz.astgen.instructions.items(.tag); - if (zir_tags[result_index].isParam()) + if (zir_tags[result_index].isParam() or astgen.isInferred(result)) return gz.addUnTok(.ref, result, src_token); const gop = try astgen.ref_table.getOrPut(astgen.gpa, result_index); if (!gop.found_existing) { @@ -12196,6 +12196,13 @@ fn isInferred(astgen: *AstGen, ref: Zir.Inst.Ref) bool { .alloc_inferred_comptime_mut, => true, + .extended => { + const zir_data = astgen.instructions.items(.data); + if (zir_data[inst].extended.opcode != .alloc) return false; + const small = @bitCast(Zir.Inst.AllocExtended.Small, zir_data[inst].extended.small); + return !small.has_type; + }, + else => false, }; } diff --git a/test/behavior.zig b/test/behavior.zig index 442b27c09f..aa59fb32b0 100644 --- a/test/behavior.zig +++ b/test/behavior.zig @@ -108,8 +108,9 @@ test { _ = @import("behavior/bugs/13112.zig"); _ = @import("behavior/bugs/13128.zig"); _ = @import("behavior/bugs/13164.zig"); - _ = @import("behavior/bugs/13171.zig"); _ = @import("behavior/bugs/13159.zig"); + _ = @import("behavior/bugs/13171.zig"); + _ = @import("behavior/bugs/13285.zig"); _ = @import("behavior/byteswap.zig"); _ = @import("behavior/byval_arg_var.zig"); _ = @import("behavior/call.zig"); diff --git a/test/behavior/bugs/13285.zig b/test/behavior/bugs/13285.zig new file mode 100644 index 0000000000..ad37f9876a --- /dev/null +++ b/test/behavior/bugs/13285.zig @@ -0,0 +1,11 @@ +const Crasher = struct { + lets_crash: u64 = 0, +}; + +test { + var a: Crasher = undefined; + var crasher_ptr = &a; + var crasher_local = crasher_ptr.*; + const crasher_local_ptr = &crasher_local; + crasher_local_ptr.lets_crash = 1; +} |
