AST: Propagate 'AlignIsRequired' though many levels of typedefs
authorDavid Majnemer <david.majnemer@gmail.com>
Mon, 4 Aug 2014 05:11:01 +0000 (05:11 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Mon, 4 Aug 2014 05:11:01 +0000 (05:11 +0000)
A typedef of a typedef should have AlignIsRequired if *either* typedef
has an AlignAttr attached to it.

llvm-svn: 214698

clang/lib/AST/ASTContext.cpp
clang/test/Layout/ms-x86-pack-and-align.cpp

index 7a30960..6545d3b 100644 (file)
@@ -1707,8 +1707,10 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const {
     if (unsigned AttrAlign = Typedef->getMaxAlignment()) {
       Align = AttrAlign;
       AlignIsRequired = true;
-    } else
+    } else {
       Align = Info.Align;
+      AlignIsRequired = Info.AlignIsRequired;
+    }
     Width = Info.Width;
     break;
   }
index 73dcc7f..e2f03d7 100644 (file)
@@ -684,6 +684,34 @@ struct PC {
 // CHECK-X64-NEXT:      | [sizeof=16, align=8
 // CHECK-X64-NEXT:      |  nvsize=12, nvalign=8]
 
+typedef PB PD;
+
+#pragma pack(push, 1)
+struct PE {
+  char a;
+  PD x;
+};
+#pragma pack(pop)
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK:         0 | struct PE
+// CHECK-NEXT:    0 |   char a
+// CHECK-NEXT:    8 |   struct PA x
+// CHECK-NEXT:    8 |     int c
+// CHECK-NEXT:      |   [sizeof=4, align=4
+// CHECK-NEXT:      |    nvsize=4, nvalign=4]
+// CHECK-NEXT:      | [sizeof=16, align=8
+// CHECK-NEXT:      |  nvsize=12, nvalign=8]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64:         0 | struct PE
+// CHECK-X64-NEXT:    0 |   char a
+// CHECK-X64-NEXT:    8 |   struct PA x
+// CHECK-X64-NEXT:    8 |     int c
+// CHECK-X64-NEXT:      |   [sizeof=4, align=4
+// CHECK-X64-NEXT:      |    nvsize=4, nvalign=4]
+// CHECK-X64-NEXT:      | [sizeof=16, align=8
+// CHECK-X64-NEXT:      |  nvsize=12, nvalign=8]
+
 typedef int __declspec(align(2)) QA;
 #pragma pack(push, 1)
 struct QB {
@@ -768,6 +796,7 @@ sizeof(RE)+
 sizeof(ND)+
 sizeof(OD)+
 sizeof(PC)+
+sizeof(PE)+
 sizeof(QB)+
 sizeof(QC)+
 sizeof(QD)+