]> granicus.if.org Git - clang/commitdiff
[MS ABI] Don't crash when inheriting from base with trailing empty array member
authorDavid Majnemer <david.majnemer@gmail.com>
Thu, 22 Oct 2015 18:04:22 +0000 (18:04 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Thu, 22 Oct 2015 18:04:22 +0000 (18:04 +0000)
We got this right for Itanium but not MSVC because CGRecordLayoutBuilder
was checking if the base's size was zero when it should have been
checking the non-virtual size.

This fixes PR21040.

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

lib/CodeGen/CGRecordLayoutBuilder.cpp
test/Layout/ms-x86-empty-nonvirtual-bases.cpp

index f91ecebd09262d5bdc7e891fe3ff0a55c8671087..375b59c5cb3391d1143702e448d42e363ff65156 100644 (file)
@@ -454,7 +454,7 @@ void CGRecordLowering::accumulateBases() {
     // contain only a trailing array member.
     const CXXRecordDecl *BaseDecl = Base.getType()->getAsCXXRecordDecl();
     if (!BaseDecl->isEmpty() &&
-        !Context.getASTRecordLayout(BaseDecl).getSize().isZero())
+        !Context.getASTRecordLayout(BaseDecl).getNonVirtualSize().isZero())
       Members.push_back(MemberInfo(Layout.getBaseClassOffset(BaseDecl),
           MemberInfo::Base, getStorageType(BaseDecl), BaseDecl));
   }
index 00906e986279ba43a20fb59d7aefc5e6ec39b547..07be1d836ec5fe0991390387618e9a054a5757a0 100644 (file)
@@ -159,6 +159,28 @@ struct __declspec(align(32)) H : B0, B1, B2, B3, B4 {
 // CHECK-NEXT:      | [sizeof=64, align=32
 // CHECK-NEXT:      |  nvsize=40, nvalign=32]
 
+struct I {
+  int i0[0];
+};
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:    0 | struct I
+// CHECK-NEXT:    0 |   int [0] i0
+// CHECK-NEXT:      | [sizeof={{1|4}}, align=4,
+// CHECK-NEXT:      |  nvsize=0, nvalign=4]
+
+struct J : I {
+  int j;
+};
+
+// CHECK: *** Dumping AST Record Layout
+// CHECK-NEXT:   0 | struct J
+// CHECK-NEXT:   0 |   struct I (base)
+// CHECK-NEXT:   0 |     int [0] i0
+// CHECK-NEXT:   0 |   int j
+// CHECK-NEXT:     | [sizeof=4, align=4,
+// CHECK-NEXT:     |  nvsize=4, nvalign=4]
+
 int a[
 sizeof(A)+
 sizeof(B)+
@@ -167,4 +189,6 @@ sizeof(D)+
 sizeof(E)+
 sizeof(F)+
 sizeof(G)+
-sizeof(H)];
+sizeof(H)+
+sizeof(I)+
+sizeof(J)];