https://github.com/anondeveg updated https://github.com/llvm/llvm-project/pull/219661
>From 89edd14d8bd843326d638d7eba6018ef244a5b16 Mon Sep 17 00:00:00 2001 From: Anondev <[email protected]> Date: Sat, 29 Aug 2026 12:23:30 +0300 Subject: [PATCH] [clang][AST] Fix assertion on AIX when ms_struct aligns a double --- clang/lib/AST/RecordLayoutBuilder.cpp | 6 +-- .../test/Layout/aix-double-struct-member.cpp | 40 +++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index e6da6c78238c1..6deb8d46a93a1 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -1996,9 +1996,9 @@ void ItaniumRecordLayoutBuilder::LayoutField(const FieldDecl *D, auto performBuiltinTypeAlignmentUpgrade = [&](const BuiltinType *BTy) { if (BTy->getKind() == BuiltinType::Double || BTy->getKind() == BuiltinType::LongDouble) { - assert(PreferredAlign == CharUnits::fromQuantity(4) && - "No need to upgrade the alignment value."); - PreferredAlign = CharUnits::fromQuantity(8); + if (PreferredAlign == CharUnits::fromQuantity(4)) { + PreferredAlign = CharUnits::fromQuantity(8); + } } }; diff --git a/clang/test/Layout/aix-double-struct-member.cpp b/clang/test/Layout/aix-double-struct-member.cpp index 6e091fcb1b1e1..7d183d24ac99d 100644 --- a/clang/test/Layout/aix-double-struct-member.cpp +++ b/clang/test/Layout/aix-double-struct-member.cpp @@ -431,3 +431,43 @@ int g = sizeof(G); // CHECK-NEXT: | nvsize=20, nvalign=2, preferrednvalign=2] } // namespace test11 +namespace test12 { +// Fields whose base element is `double`/`long double` test their natural +// 8-byte alignment under __ms_struct__. +// See: issue 219627. +struct __attribute__((__ms_struct__)) S { double d; }; +int a = sizeof(S); + +struct __attribute__((__ms_struct__)) LD { long double d; }; +int b = sizeof(LD); + +struct __attribute__((__ms_struct__)) CD { _Complex double d; }; +int c = sizeof(CD); + +struct __attribute__((__ms_struct__)) Arr { double d[4]; }; +int e = sizeof(Arr); + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct test12::S +// CHECK-NEXT: 0 | double d +// CHECK-NEXT: | [sizeof=8, dsize=8, align=8, preferredalign=8, +// CHECK-NEXT: | nvsize=8, nvalign=8, preferrednvalign=8] + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct test12::LD +// CHECK-NEXT: 0 | long double d +// CHECK-NEXT: | [sizeof=8, dsize=8, align=8, preferredalign=8, +// CHECK-NEXT: | nvsize=8, nvalign=8, preferrednvalign=8] + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct test12::CD +// CHECK-NEXT: 0 | _Complex double d +// CHECK-NEXT: | [sizeof=16, dsize=16, align=4, preferredalign=8, +// CHECK-NEXT: | nvsize=16, nvalign=4, preferrednvalign=8] + +// CHECK: *** Dumping AST Record Layout +// CHECK-NEXT: 0 | struct test12::Arr +// CHECK-NEXT: 0 | double[4] d +// CHECK-NEXT: | [sizeof=32, dsize=32, align=8, preferredalign=8, +// CHECK-NEXT: | nvsize=32, nvalign=8, preferrednvalign=8] +} // namespace test12 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
