aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVeikka Tuominen <git@vexu.eu>2023-01-22 17:26:32 +0200
committerVeikka Tuominen <git@vexu.eu>2023-01-30 15:20:16 +0200
commit720d82721fa6013b2e7e7ff2866db9404bfd2901 (patch)
tree6ce2b7bb0e2a7134073d47c22fc30739475a5059
parent92dfc07489c3f8514792434e2857b419ebf1f208 (diff)
downloadzig-720d82721fa6013b2e7e7ff2866db9404bfd2901.tar.gz
zig-720d82721fa6013b2e7e7ff2866db9404bfd2901.zip
Sema: ensure args to inline comptime args are comptime-known
Closes #14413
-rw-r--r--src/Sema.zig5
-rw-r--r--test/cases/compile_errors/inline_call_runtime_value_to_comptime_param.zig17
2 files changed, 22 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index 9c553a0092..3b744a4f78 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -6879,6 +6879,8 @@ fn analyzeInlineCallArg(
if (err == error.AnalysisFail and param_block.comptime_reason != null) try param_block.comptime_reason.?.explain(sema, sema.err);
return err;
};
+ } else if (!is_comptime_call and zir_tags[inst] == .param_comptime) {
+ _ = try sema.resolveConstMaybeUndefVal(arg_block, arg_src, uncasted_arg, "parameter is comptime");
}
const casted_arg = sema.coerceExtra(arg_block, param_ty, uncasted_arg, arg_src, .{ .param_src = .{
.func_inst = func_inst,
@@ -6952,6 +6954,9 @@ fn analyzeInlineCallArg(
.val = arg_val,
};
} else {
+ if (zir_tags[inst] == .param_anytype_comptime) {
+ _ = try sema.resolveConstMaybeUndefVal(arg_block, arg_src, uncasted_arg, "parameter is comptime");
+ }
sema.inst_map.putAssumeCapacityNoClobber(inst, uncasted_arg);
}
diff --git a/test/cases/compile_errors/inline_call_runtime_value_to_comptime_param.zig b/test/cases/compile_errors/inline_call_runtime_value_to_comptime_param.zig
new file mode 100644
index 0000000000..cddd91384b
--- /dev/null
+++ b/test/cases/compile_errors/inline_call_runtime_value_to_comptime_param.zig
@@ -0,0 +1,17 @@
+inline fn needComptime(comptime a: u64) void {
+ if (a != 0) @compileError("foo");
+}
+fn acceptRuntime(value: u64) void {
+ needComptime(value);
+}
+pub export fn entry() void {
+ var value: u64 = 0;
+ acceptRuntime(value);
+}
+
+// error
+// backend=stage2
+// target=native
+//
+// :5:18: error: unable to resolve comptime value
+// :5:18: note: parameter is comptime