commit 41e52bd5ccaccc0191c9f3434098d27ed07f62b7 (tree)
parent c710d5eefe3f83226f1651947239730e77af43cb
Author: Robin Voetter <robin@voetter.nl>
Date: Mon, 27 Dec 2021 01:22:57 +0100
stage2: don't call comptime functions with generic poison arguments
When calling a comptime or inline function, if the parameter is generic and
is resolved to generic_poison or generic_poison_type, the invocation was
part of another function's parameters or return type expression and is
dependent on an as-of-yet type of another parameter. In this case, processing
should stop, and we return error.GenericPoison to let the caller in funcCommon,
zirParam or zirParamAnytype know that the function is generic.
Diffstat:
1 file changed, 16 insertions(+), 0 deletions(-)
diff --git a/src/Sema.zig b/src/Sema.zig
@@ -3888,6 +3888,14 @@ fn analyzeCall(
if (is_comptime_call) {
const arg_val = try sema.resolveConstMaybeUndefVal(&child_block, arg_src, casted_arg);
+ switch (arg_val.tag()) {
+ .generic_poison, .generic_poison_type => {
+ // This function is currently evaluated as part of an as-of-yet unresolvable
+ // parameter or return type.
+ return error.GenericPoison;
+ },
+ else => {},
+ }
memoized_call_key.args[arg_i] = .{
.ty = param_ty,
.val = arg_val,
@@ -3905,6 +3913,14 @@ fn analyzeCall(
if (is_comptime_call) {
const arg_src = call_src; // TODO: better source location
const arg_val = try sema.resolveConstMaybeUndefVal(&child_block, arg_src, uncasted_arg);
+ switch (arg_val.tag()) {
+ .generic_poison, .generic_poison_type => {
+ // This function is currently evaluated as part of an as-of-yet unresolvable
+ // parameter or return type.
+ return error.GenericPoison;
+ },
+ else => {},
+ }
memoized_call_key.args[arg_i] = .{
.ty = sema.typeOf(uncasted_arg),
.val = arg_val,