Commit a91a8df679

Jacob Young <jacobly0@users.noreply.github.com>
2023-08-05 09:31:33
Sema: fix issues passing an invalid type to a generic method
Closes #16601
1 parent fc6e575
Changed files (2)
src/Sema.zig
@@ -7622,7 +7622,7 @@ fn instantiateGenericCall(
             else if (call_src == .node_offset) .{ .call_arg = .{
                 .decl = block.src_decl,
                 .call_node_offset = call_src.node_offset.x,
-                .arg_index = @intCast(total_i),
+                .arg_index = @intCast(total_i - @intFromBool(bound_arg_src != null)),
             } } else .unneeded;
 
             const comptime_arg = callee.comptime_args.get(ip)[total_i];
@@ -9343,17 +9343,6 @@ fn zirParam(
         assert(sema.inst_map.remove(inst));
     }
 
-    if (sema.generic_owner != .none) {
-        if (try sema.typeHasOnePossibleValue(param_ty)) |opv| {
-            // In this case we are instantiating a generic function call with a non-comptime
-            // non-anytype parameter that ended up being a one-possible-type.
-            // We don't want the parameter to be part of the instantiated function type.
-            sema.inst_map.putAssumeCapacity(inst, Air.internedToRef(opv.toIntern()));
-            sema.comptime_args[param_index] = opv.toIntern();
-            return;
-        }
-    }
-
     try block.params.append(sema.arena, .{
         .ty = param_ty.toIntern(),
         .is_comptime = comptime_syntax,
test/cases/compile_errors/generic_method_call_invalid_coercion.zig
@@ -0,0 +1,21 @@
+export fn callBoolMethod() void {
+    const s = S{};
+    s.boolMethod({});
+}
+
+export fn callVoidMethod() void {
+    const s = S{};
+    s.voidMethod(false);
+}
+
+const S = struct {
+    fn boolMethod(comptime _: @This(), _: bool) void {}
+    fn voidMethod(comptime _: @This(), _: void) void {}
+};
+
+// error
+// backend=stage2
+// target=native
+//
+// :3:18: error: expected type 'bool', found 'void'
+// :8:18: error: expected type 'void', found 'bool'