aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2022-10-24 17:30:47 +0300
committerVeikka Tuominen <git@vexu.eu>2022-10-27 01:31:18 +0300
commit4ac8ec4c5c80f6eca0ac7d7955c5486ef55ce042 (patch)
tree2c3c82f5531e65b74d34b003a8048956a04b873c
parent4fc944dde813638410850515b0d1b156e5b6e920 (diff)
downloadzig-4ac8ec4c5c80f6eca0ac7d7955c5486ef55ce042.tar.gz
zig-4ac8ec4c5c80f6eca0ac7d7955c5486ef55ce042.zip
AstGen: fix `ref`ing inferred allocs
Closes #13285
-rw-r--r--src/AstGen.zig9
-rw-r--r--test/behavior.zig3
-rw-r--r--test/behavior/bugs/13285.zig11
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;
+}