commit 01d19a8d3cdd52ad50f45bfb8666b56ccf8d3a22 (tree)
parent 67a44211f7a442d33096cc0dfff059eee9315bc6
Author: Veikka Tuominen <git@vexu.eu>
Date: Tue, 30 Aug 2022 14:40:48 +0300
Sema: do not emit generic poison for non generic parameters
Closes #12679
Diffstat:
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/src/Sema.zig b/src/Sema.zig
@@ -8195,8 +8195,22 @@ fn zirParam(
.is_comptime = comptime_syntax,
.name = param_name,
});
- const result = try sema.addConstant(param_ty, Value.initTag(.generic_poison));
- try sema.inst_map.putNoClobber(sema.gpa, inst, result);
+
+ if (is_comptime) {
+ // If this is a comptime parameter we can add a constant generic_poison
+ // since this is also a generic parameter.
+ const result = try sema.addConstant(param_ty, Value.initTag(.generic_poison));
+ try sema.inst_map.putNoClobber(sema.gpa, inst, result);
+ } else {
+ // Otherwise we need a dummy runtime instruction.
+ const result_index = @intCast(Air.Inst.Index, sema.air_instructions.len);
+ try sema.air_instructions.append(sema.gpa, .{
+ .tag = .alloc,
+ .data = .{ .ty = param_ty },
+ });
+ const result = Air.indexToRef(result_index);
+ try sema.inst_map.putNoClobber(sema.gpa, inst, result);
+ }
}
fn zirParamAnytype(
diff --git a/test/cases/compile_errors/non-comptime-parameter-used-as-array-size.zig b/test/cases/compile_errors/non-comptime-parameter-used-as-array-size.zig
@@ -0,0 +1,16 @@
+export fn entry() void {
+ const llamas1 = makeLlamas(5);
+ const llamas2 = makeLlamas(5);
+ _ = llamas1;
+ _ = llamas2;
+}
+
+fn makeLlamas(count: usize) [count]u8 {
+ _ = count;
+}
+
+// error
+// target=native
+//
+// :8:30: error: unable to resolve comptime value
+// :8:30: note: array length must be comptime known