diff options
| author | Evin Yulo <yujiri@disroot.org> | 2023-05-31 08:05:55 -0400 |
|---|---|---|
| committer | Veikka Tuominen <git@vexu.eu> | 2023-05-31 19:18:36 +0300 |
| commit | 3085e2af4197193f08ea95d80afb2cf982227334 (patch) | |
| tree | 5bdd8be63ea03f2396e1d35fe5a50697f7ce6710 /src/Sema.zig | |
| parent | cd1417dbdf098634641e87dba4c3be2806d76250 (diff) | |
| download | zig-3085e2af4197193f08ea95d80afb2cf982227334.tar.gz zig-3085e2af4197193f08ea95d80afb2cf982227334.zip | |
add missing note "operation is runtime due to this operand"
Diffstat (limited to 'src/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/Sema.zig b/src/Sema.zig index 52eba5bc5c..44daa02780 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -17961,20 +17961,21 @@ fn finishStructInit( return sema.failWithOwnedErrorMsg(msg); } - const is_comptime = for (field_inits) |field_init| { + // Find which field forces the expression to be runtime, if any. + const opt_runtime_index = for (field_inits, 0..) |field_init, i| { if (!(try sema.isComptimeKnown(field_init))) { - break false; + break i; } - } else true; + } else null; - if (is_comptime) { + const runtime_index = opt_runtime_index orelse { const values = try sema.arena.alloc(Value, field_inits.len); for (field_inits, 0..) |field_init, i| { values[i] = (sema.resolveMaybeUndefVal(field_init) catch unreachable).?; } const struct_val = try Value.Tag.aggregate.create(sema.arena, values); return sema.addConstantMaybeRef(block, struct_ty, struct_val, is_ref); - } + }; if (is_ref) { try sema.resolveStructLayout(struct_ty); @@ -17994,7 +17995,15 @@ fn finishStructInit( return sema.makePtrConst(block, alloc); } - try sema.requireRuntimeBlock(block, dest_src, null); + sema.requireRuntimeBlock(block, .unneeded, null) catch |err| switch (err) { + error.NeededSourceLocation => { + const decl = sema.mod.declPtr(block.src_decl); + const field_src = Module.initSrc(dest_src.node_offset.x, sema.gpa, decl, runtime_index); + try sema.requireRuntimeBlock(block, dest_src, field_src); + unreachable; + }, + else => |e| return e, + }; try sema.queueFullTypeResolution(struct_ty); return block.addAggregateInit(struct_ty, field_inits); } @@ -18014,6 +18023,7 @@ fn zirStructInitAnon( defer fields.deinit(sema.gpa); try fields.ensureUnusedCapacity(sema.gpa, types.len); + // Find which field forces the expression to be runtime, if any. const opt_runtime_index = rs: { var runtime_index: ?usize = null; var extra_index = extra.end; |
