authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-01-22 17:26:32+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2023-01-30 15:20:16+02:00
log720d82721fa6013b2e7e7ff2866db9404bfd2901
tree6ce2b7bb0e2a7134073d47c22fc30739475a5059
parent92dfc07489c3f8514792434e2857b419ebf1f208

Sema: ensure args to inline comptime args are comptime-known

Closes #14413

2 files changed, 22 insertions(+), 0 deletions(-)

src/Sema.zig+5
...@@ -6879,6 +6879,8 @@ fn analyzeInlineCallArg(...@@ -6879,6 +6879,8 @@ fn analyzeInlineCallArg(
6879 if (err == error.AnalysisFail and param_block.comptime_reason != null) try param_block.comptime_reason.?.explain(sema, sema.err);6879 if (err == error.AnalysisFail and param_block.comptime_reason != null) try param_block.comptime_reason.?.explain(sema, sema.err);
6880 return err;6880 return err;
6881 };6881 };
6882 } else if (!is_comptime_call and zir_tags[inst] == .param_comptime) {
6883 _ = try sema.resolveConstMaybeUndefVal(arg_block, arg_src, uncasted_arg, "parameter is comptime");
6882 }6884 }
6883 const casted_arg = sema.coerceExtra(arg_block, param_ty, uncasted_arg, arg_src, .{ .param_src = .{6885 const casted_arg = sema.coerceExtra(arg_block, param_ty, uncasted_arg, arg_src, .{ .param_src = .{
6884 .func_inst = func_inst,6886 .func_inst = func_inst,
...@@ -6952,6 +6954,9 @@ fn analyzeInlineCallArg(...@@ -6952,6 +6954,9 @@ fn analyzeInlineCallArg(
6952 .val = arg_val,6954 .val = arg_val,
6953 };6955 };
6954 } else {6956 } else {
6957 if (zir_tags[inst] == .param_anytype_comptime) {
6958 _ = try sema.resolveConstMaybeUndefVal(arg_block, arg_src, uncasted_arg, "parameter is comptime");
6959 }
6955 sema.inst_map.putAssumeCapacityNoClobber(inst, uncasted_arg);6960 sema.inst_map.putAssumeCapacityNoClobber(inst, uncasted_arg);
6956 }6961 }
69576962
test/cases/compile_errors/inline_call_runtime_value_to_comptime_param.zig created+17
...@@ -0,0 +1,17 @@
1inline fn needComptime(comptime a: u64) void {
2 if (a != 0) @compileError("foo");
3}
4fn acceptRuntime(value: u64) void {
5 needComptime(value);
6}
7pub export fn entry() void {
8 var value: u64 = 0;
9 acceptRuntime(value);
10}
11
12// error
13// backend=stage2
14// target=native
15//
16// :5:18: error: unable to resolve comptime value
17// :5:18: note: parameter is comptime