authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-25 02:05:58+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-11-26 18:05:27+02:00
logbf62cb453bb1e91cd0ed448de70bd4f076b81906
treef889443716b7b02409be001a1f7aa273d741ddc8
parentd0dd0bda1c8773243f98ac1e073afc32c4ce4cf2

Sema: handle anytype parameter requiring comptime

Closes #13645

2 files changed, 32 insertions(+), 7 deletions(-)

src/Sema.zig+12-7
...@@ -7031,16 +7031,21 @@ fn instantiateGenericCall(...@@ -7031,16 +7031,21 @@ fn instantiateGenericCall(
7031 }7031 }
7032 const arg = uncasted_args[arg_i];7032 const arg = uncasted_args[arg_i];
7033 if (is_comptime) {7033 if (is_comptime) {
7034 if (try sema.resolveMaybeUndefVal(arg)) |arg_val| {7034 const arg_val = (try sema.resolveMaybeUndefVal(arg)).?;
7035 const child_arg = try child_sema.addConstant(sema.typeOf(arg), arg_val);7035 const child_arg = try child_sema.addConstant(sema.typeOf(arg), arg_val);
7036 child_sema.inst_map.putAssumeCapacityNoClobber(inst, child_arg);7036 child_sema.inst_map.putAssumeCapacityNoClobber(inst, child_arg);
7037 } else {
7038 return sema.failWithNeededComptime(block, .unneeded, "");
7039 }
7040 } else if (is_anytype) {7037 } else if (is_anytype) {
7041 const arg_ty = sema.typeOf(arg);7038 const arg_ty = sema.typeOf(arg);
7042 if (try sema.typeRequiresComptime(arg_ty)) {7039 if (try sema.typeRequiresComptime(arg_ty)) {
7043 const arg_val = try sema.resolveConstValue(block, .unneeded, arg, "");7040 const arg_val = sema.resolveConstValue(block, .unneeded, arg, "") catch |err| switch (err) {
7041 error.NeededSourceLocation => {
7042 const decl = sema.mod.declPtr(block.src_decl);
7043 const arg_src = Module.argSrc(call_src.node_offset.x, sema.gpa, decl, arg_i, bound_arg_src);
7044 _ = try sema.resolveConstValue(block, arg_src, arg, "argument to parameter with comptime-only type must be comptime-known");
7045 return error.AnalysisFail;
7046 },
7047 else => |e| return e,
7048 };
7044 const child_arg = try child_sema.addConstant(arg_ty, arg_val);7049 const child_arg = try child_sema.addConstant(arg_ty, arg_val);
7045 child_sema.inst_map.putAssumeCapacityNoClobber(inst, child_arg);7050 child_sema.inst_map.putAssumeCapacityNoClobber(inst, child_arg);
7046 } else {7051 } else {
test/cases/compile_errors/anytype_param_requires_comptime.zig created+20
...@@ -0,0 +1,20 @@
1const S = struct {
2 fn foo(b: u32, c: anytype) void {
3 const C = struct {
4 c: @TypeOf(c),
5 b: u32,
6 };
7 bar(C{ .c = c, .b = b });
8 }
9 fn bar(_: anytype) void {}
10};
11pub export fn entry() void {
12 S.foo(0, u32);
13}
14
15// error
16// backend=stage2
17// target=native
18//
19// :7:14: error: unable to resolve comptime value
20// :7:14: note: argument to parameter with comptime-only type must be comptime-known