From 6193470ceea89a986eb38a9abd7548118d18aab7 Mon Sep 17 00:00:00 2001 From: pentuppup Date: Thu, 2 Apr 2026 14:57:33 -0400 Subject: [PATCH] error on tuples in extern contexts --- src/Sema.zig | 4 ++++ src/Type.zig | 1 + .../cases/compile_errors/tuple_in_extern_context.zig | 12 ++++++++++++ 3 files changed, 17 insertions(+) create mode 100644 test/cases/compile_errors/tuple_in_extern_context.zig diff --git a/src/Sema.zig b/src/Sema.zig index bda2659d8b1cdc0a2a81f0141017bfaff16fb0b6..a648a89e0c8f156d4260dd3cf3c0bc059159bf82 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -25262,6 +25262,10 @@ pub fn explainWhyTypeIsNotExtern( } }, .@"struct" => { + if (ty.isTuple(zcu)) { + return sema.errNote(src_loc, msg, "tuples have no guaranteed in-memory representation", .{}); + } + const struct_obj = zcu.intern_pool.loadStructType(ty.toIntern()); switch (struct_obj.layout) { .auto => try sema.errNote(src_loc, msg, "struct with automatic layout has no guaranteed in-memory representation", .{}), diff --git a/src/Type.zig b/src/Type.zig index 7902788d1cbfcb1101485629012f369aa913cead..9aaf392dd63586f756e9de16801c5caca7c97146 100644 --- a/src/Type.zig +++ b/src/Type.zig @@ -3186,6 +3186,7 @@ pub fn validateExtern(ty: Type, position: ExternPosition, zcu: *const Zcu) bool }; }, .@"struct" => { + if (ty.isTuple(zcu)) return false; const struct_obj = zcu.intern_pool.loadStructType(ty.toIntern()); return switch (struct_obj.layout) { .auto => false, diff --git a/test/cases/compile_errors/tuple_in_extern_context.zig b/test/cases/compile_errors/tuple_in_extern_context.zig new file mode 100644 index 0000000000000000000000000000000000000000..5034fe8f87eff285382da300392659e6dc72484a --- /dev/null +++ b/test/cases/compile_errors/tuple_in_extern_context.zig @@ -0,0 +1,12 @@ +const S = extern struct { + f: struct { u32 }, +}; + +comptime { + _ = @sizeOf(S); +} + +// error +// +// :2:8: error: extern structs cannot contain fields of type 'struct { u32 }' +// :2:8: note: tuples have no guaranteed in-memory representation -- 2.54.0