]> granicus.if.org Git - clang/commitdiff
[MS-ABI] Fix MSRecordLayout to handel MultiDimensionalArrays
authorWarren Hunt <whunt@google.com>
Sat, 22 Feb 2014 00:40:37 +0000 (00:40 +0000)
committerWarren Hunt <whunt@google.com>
Sat, 22 Feb 2014 00:40:37 +0000 (00:40 +0000)
A recent change caused multi-dimensional arrays not to be handled
correctly, this patch fixes that.  Also, it adds a lit test for
multi-dimensional arrays.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@201917 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/RecordLayoutBuilder.cpp
test/Layout/ms-x86-basic-layout.cpp

index a038e2dc6a5d0bc819d961fe94fa931d48128296..731f197fe083408410db88a9e8a375c7d7d61a83 100644 (file)
@@ -2271,8 +2271,9 @@ MicrosoftRecordLayoutBuilder::getAdjustedElementInfo(
     // Get the element info for a layout, respecting pack.
     Info = getAdjustedElementInfo(Layout, false);
     // If the field is an array type, scale it's size properly.
-    if (const ConstantArrayType *CAT =
-        dyn_cast<ConstantArrayType>(FD->getType()))
+    for (const ConstantArrayType *CAT =
+         dyn_cast<ConstantArrayType>(FD->getType()); CAT; 
+         CAT = dyn_cast<ConstantArrayType>(CAT->getElementType()))
       Info.Size = Info.Size * (int64_t)CAT->getSize().getZExtValue();
     // Capture required alignment as a side-effect.
     RequiredAlignment = std::max(RequiredAlignment,
index f4fd34a2658f0af6f85bc45a70f4bb4a1f40cadc..c522de84b288ca84cc31625991b2a245ce66cb79 100644 (file)
@@ -785,6 +785,21 @@ struct ArrayFieldOfRecords {
 // CHECK-X64-NEXT:      | [sizeof=8, align=4
 // CHECK-X64-NEXT:      |  nvsize=8, nvalign=4]
 
+struct ArrayOfArrayFieldOfRecords {
+  A4 InlineElts[2][2];
+};
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct ArrayOfArrayFieldOfRecords
+// CHECK-NEXT:    0 |   struct A4 [2][2] InlineElts
+// CHECK-NEXT:      | [sizeof=16, align=4
+// CHECK-NEXT:      |  nvsize=16, nvalign=4]
+// CHECK-X64: *** Dumping AST Record Layout
+// CHECK-X64-NEXT:    0 | struct ArrayOfArrayFieldOfRecords
+// CHECK-X64-NEXT:    0 |   struct A4 [2][2] InlineElts
+// CHECK-X64-NEXT:      | [sizeof=16, align=4
+// CHECK-X64-NEXT:      |  nvsize=16, nvalign=4]
+
 int a[
 sizeof(TestF0)+
 sizeof(TestF1)+
@@ -806,4 +821,6 @@ sizeof(F3)+
 sizeof(F4)+
 sizeof(F5)+
 sizeof(F6)+
-sizeof(ArrayFieldOfRecords)];
+sizeof(ArrayFieldOfRecords)+
+sizeof(ArrayOfArrayFieldOfRecords)+
+0];