Commit 41e52bd5cc

Robin Voetter <robin@voetter.nl>
2021-12-27 01:22:57
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.
1 parent c710d5e
Changed files (1)
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,