authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-12-27 01:22:57+01:00
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2022-01-03 00:19:59+01:00
log41e52bd5ccaccc0191c9f3434098d27ed07f62b7
treefccb23581898f838afadab135beaf93219cae754
parentc710d5eefe3f83226f1651947239730e77af43cb

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 files changed, 16 insertions(+), 0 deletions(-)

src/Sema.zig+16
...@@ -3888,6 +3888,14 @@ fn analyzeCall(...@@ -3888,6 +3888,14 @@ fn analyzeCall(
38883888
3889 if (is_comptime_call) {3889 if (is_comptime_call) {
3890 const arg_val = try sema.resolveConstMaybeUndefVal(&child_block, arg_src, casted_arg);3890 const arg_val = try sema.resolveConstMaybeUndefVal(&child_block, arg_src, casted_arg);
3891 switch (arg_val.tag()) {
3892 .generic_poison, .generic_poison_type => {
3893 // This function is currently evaluated as part of an as-of-yet unresolvable
3894 // parameter or return type.
3895 return error.GenericPoison;
3896 },
3897 else => {},
3898 }
3891 memoized_call_key.args[arg_i] = .{3899 memoized_call_key.args[arg_i] = .{
3892 .ty = param_ty,3900 .ty = param_ty,
3893 .val = arg_val,3901 .val = arg_val,
...@@ -3905,6 +3913,14 @@ fn analyzeCall(...@@ -3905,6 +3913,14 @@ fn analyzeCall(
3905 if (is_comptime_call) {3913 if (is_comptime_call) {
3906 const arg_src = call_src; // TODO: better source location3914 const arg_src = call_src; // TODO: better source location
3907 const arg_val = try sema.resolveConstMaybeUndefVal(&child_block, arg_src, uncasted_arg);3915 const arg_val = try sema.resolveConstMaybeUndefVal(&child_block, arg_src, uncasted_arg);
3916 switch (arg_val.tag()) {
3917 .generic_poison, .generic_poison_type => {
3918 // This function is currently evaluated as part of an as-of-yet unresolvable
3919 // parameter or return type.
3920 return error.GenericPoison;
3921 },
3922 else => {},
3923 }
3908 memoized_call_key.args[arg_i] = .{3924 memoized_call_key.args[arg_i] = .{
3909 .ty = sema.typeOf(uncasted_arg),3925 .ty = sema.typeOf(uncasted_arg),
3910 .val = arg_val,3926 .val = arg_val,