zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit a91a8df6791b6fe228ad616acd9fbbde46451651 (tree)
parent fc6e5756848cd627b69756853937ce22500e62cc
Author: Jacob Young <jacobly0@users.noreply.github.com>
Date:   Sat,  5 Aug 2023 03:31:33 -0400

Sema: fix issues passing an invalid type to a generic method

Closes #16601

Diffstat:
Msrc/Sema.zig | 13+------------
Atest/cases/compile_errors/generic_method_call_invalid_coercion.zig | 21+++++++++++++++++++++
2 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/src/Sema.zig b/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, diff --git a/test/cases/compile_errors/generic_method_call_invalid_coercion.zig b/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'