authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-07-27 22:40:54-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-07-28 19:27:08-04:00
logc80609dfecb57a3830583eeeb3e0fce5860d657b
treed98fff3fdcccd7ab72d38b8ea3c85647e845f61b
parent20f4216af5dc4d5cb547529a132d8682ce7b7536

Sema: don't reorder tuple fields

This conflicts with anon structs which can be in-memory coercible but are never reordered. Closes #16242

2 files changed, 17 insertions(+), 1 deletions(-)

src/Sema.zig+3-1
......@@ -33491,7 +33491,9 @@ fn resolveStructLayout(sema: *Sema, ty: Type) CompileError!void {
3349133491 return sema.failWithOwnedErrorMsg(msg);
3349233492 }
3349333493
33494 if (struct_obj.layout == .Auto and mod.backendSupportsFeature(.field_reordering)) {
33494 if (struct_obj.layout == .Auto and !struct_obj.is_tuple and
33495 mod.backendSupportsFeature(.field_reordering))
33496 {
3349533497 const optimized_order = try mod.tmp_hack_arena.allocator().alloc(u32, struct_obj.fields.count());
3349633498
3349733499 for (struct_obj.fields.values(), 0..) |field, i| {
test/behavior/tuple.zig+14
......@@ -453,3 +453,17 @@ test "tuple pointer is indexable" {
453453 try expectEqual(@as(u32, 100), (&y)[0]);
454454 try expectEqual(false, (&y)[1]);
455455}
456
457test "coerce anon tuple to tuple" {
458 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
459 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
460 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
461 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
462
463 var x: u8 = 1;
464 var y: u16 = 2;
465 var t = .{ x, y };
466 var s: struct { u8, u16 } = t;
467 try expectEqual(x, s[0]);
468 try expectEqual(y, s[1]);
469}