aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-05-13 16:48:24 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-05-13 16:50:27 -0700
commite83cf6a4542b34e7fd64028a3b1b89dacdc2e166 (patch)
treeed192b102e4ca13145623216b0e808d7f1fd6059 /src
parentb109daacddf54dbe4ffcbef9041443f2759511e3 (diff)
downloadzig-e83cf6a4542b34e7fd64028a3b1b89dacdc2e166.tar.gz
zig-e83cf6a4542b34e7fd64028a3b1b89dacdc2e166.zip
Sema: detect and skip over elided instructions
It would be better if AstGen would actually omit these instructions rather than only marking them as elided, but that can be solved separately.
Diffstat (limited to 'src')
-rw-r--r--src/Sema.zig5
-rw-r--r--src/Zir.zig2
2 files changed, 7 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 626624110e..895ac84dd0 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -1461,6 +1461,11 @@ fn zirStoreToBlockPtr(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) In
defer tracy.end();
const bin_inst = sema.code.instructions.items(.data)[inst].bin;
+ if (bin_inst.lhs == .none) {
+ // This is an elided instruction, but AstGen was not smart enough
+ // to omit it.
+ return;
+ }
const ptr = try sema.resolveInst(bin_inst.lhs);
const value = try sema.resolveInst(bin_inst.rhs);
const ptr_ty = try sema.mod.simplePtrType(sema.arena, value.ty, true, .One);
diff --git a/src/Zir.zig b/src/Zir.zig
index 274098fa28..73f8e3e43b 100644
--- a/src/Zir.zig
+++ b/src/Zir.zig
@@ -484,6 +484,8 @@ pub const Inst = struct {
/// Same as `store` but the type of the value being stored will be used to infer
/// the block type. The LHS is the pointer to store to.
/// Uses the `bin` union field.
+ /// If the pointer is none, it means this instruction has been elided in
+ /// AstGen, but AstGen was unable to actually omit it from the ZIR code.
store_to_block_ptr,
/// Same as `store` but the type of the value being stored will be used to infer
/// the pointer type.