zig

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

commit adc6dec26b8ba9f79aabc4b69ae689acf4c6767d (tree)
parent 1d96a17af473d5ca79ecc7b64bbf2e899b5de3b4
Author: Ian Johnson <ian@ianjohnson.dev>
Date:   Sun, 12 Mar 2023 13:08:15 -0400

Sema: avoid panic on callconv(.C) generic return type

Fixes #14854

Diffstat:
Msrc/Sema.zig | 2+-
Mtest/behavior.zig | 1+
Atest/behavior/bugs/14854.zig | 13+++++++++++++
3 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/src/Sema.zig b/src/Sema.zig @@ -8782,7 +8782,7 @@ fn funcCommon( }; return sema.failWithOwnedErrorMsg(msg); } - if (!Type.fnCallingConventionAllowsZigTypes(cc_resolved) and !try sema.validateExternType(return_type, .ret_ty)) { + if (!ret_poison and !Type.fnCallingConventionAllowsZigTypes(cc_resolved) and !try sema.validateExternType(return_type, .ret_ty)) { const msg = msg: { const msg = try sema.errMsg(block, ret_ty_src, "return type '{}' not allowed in function with calling convention '{s}'", .{ return_type.fmt(sema.mod), @tagName(cc_resolved), diff --git a/test/behavior.zig b/test/behavior.zig @@ -141,6 +141,7 @@ test { _ = @import("behavior/bugs/13664.zig"); _ = @import("behavior/bugs/13714.zig"); _ = @import("behavior/bugs/13785.zig"); + _ = @import("behavior/bugs/14854.zig"); _ = @import("behavior/byteswap.zig"); _ = @import("behavior/byval_arg_var.zig"); _ = @import("behavior/call.zig"); diff --git a/test/behavior/bugs/14854.zig b/test/behavior/bugs/14854.zig @@ -0,0 +1,13 @@ +const testing = @import("std").testing; + +test { + try testing.expect(getGeneric(u8, getU8) == 123); +} + +fn getU8() callconv(.C) u8 { + return 123; +} + +fn getGeneric(comptime T: type, supplier: fn () callconv(.C) T) T { + return supplier(); +}