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

Reply via email to