diff options
-rw-r--r-- | clang/lib/CodeGen/CGRecordLayoutBuilder.cpp | 2 | ||||
-rw-r--r-- | clang/test/Layout/ms-x86-empty-nonvirtual-bases.cpp | 26 |
2 files changed, 26 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp index f91ecebd092..375b59c5cb3 100644 --- a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp +++ b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp @@ -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)); } diff --git a/clang/test/Layout/ms-x86-empty-nonvirtual-bases.cpp b/clang/test/Layout/ms-x86-empty-nonvirtual-bases.cpp index 00906e98627..07be1d836ec 100644 --- a/clang/test/Layout/ms-x86-empty-nonvirtual-bases.cpp +++ b/clang/test/Layout/ms-x86-empty-nonvirtual-bases.cpp @@ -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)]; |