From 0f87031cdaf2a05c6d45c99b4b549db49803ffca Mon Sep 17 00:00:00 2001 From: David Rubin Date: Tue, 9 Jun 2026 17:24:16 -0700 Subject: [PATCH] Sema: correctly compare callconv stack alignment --- src/Sema.zig | 2 +- .../compile_errors/callconv_stack_alignment_coerce.zig | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 test/cases/compile_errors/callconv_stack_alignment_coerce.zig diff --git a/src/Sema.zig b/src/Sema.zig index c9c96cc4ce82fc6da580303757eaba0de9ecdda2..772ab452eb084bdfd98a0f42b7071ee92fbe748b 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -29126,7 +29126,7 @@ fn callconvCoerceAllowed( if (@TypeOf(src_data) != void) { const default_stack_align = target.stackAlignment(); const src_stack_align = src_data.incoming_stack_alignment orelse default_stack_align; - const dest_stack_align = src_data.incoming_stack_alignment orelse default_stack_align; + const dest_stack_align = dest_data.incoming_stack_alignment orelse default_stack_align; if (dest_stack_align < src_stack_align) return false; } switch (@TypeOf(src_data)) { diff --git a/test/cases/compile_errors/callconv_stack_alignment_coerce.zig b/test/cases/compile_errors/callconv_stack_alignment_coerce.zig new file mode 100644 index 0000000000000000000000000000000000000000..0f09ba230038853d395a5d44dc3699df96960628 --- /dev/null +++ b/test/cases/compile_errors/callconv_stack_alignment_coerce.zig @@ -0,0 +1,10 @@ +fn foo() callconv(.{ .x86_64_sysv = .{ .incoming_stack_alignment = 32 } }) void {} +const Bar = *const fn () callconv(.{ .x86_64_sysv = .{ .incoming_stack_alignment = 16 } }) void; +export var p: Bar = &foo; + +// error +// target=x86_64-linux-none +// +// :3:21: error: expected type '*const fn () callconv(.{ .x86_64_sysv = .{ .incoming_stack_alignment = 16 } }) void', found '*const fn () callconv(.{ .x86_64_sysv = .{ .incoming_stack_alignment = 32 } }) void' +// :3:21: note: pointer type child 'fn () callconv(.{ .x86_64_sysv = .{ .incoming_stack_alignment = 32 } }) void' cannot cast into pointer type child 'fn () callconv(.{ .x86_64_sysv = .{ .incoming_stack_alignment = 16 } }) void' +// :3:21: note: calling convention 'x86_64_sysv' cannot cast into calling convention 'x86_64_sysv' -- 2.54.0