diff --git a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp index 6a5b6decc833..a1cc2aec5068 100644 --- a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp +++ b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp @@ -558,7 +558,12 @@ bool CGRecordLayoutBuilder::LayoutBase(const CXXRecordDecl *base, if (getTypeAlignment(subobjectType) > Alignment) return false; - AppendField(baseOffset, subobjectType); + if (LastLaidOutBase.NonVirtualSize < CharUnits::fromQuantity( + Types.getDataLayout().getStructLayout(subobjectType)->getSizeInBytes())) + AppendBytes(LastLaidOutBase.NonVirtualSize); + else + AppendField(baseOffset, subobjectType); + return true; } diff --git a/clang/test/CodeGenCXX/pragma-pack-3.cpp b/clang/test/CodeGenCXX/pragma-pack-3.cpp new file mode 100644 index 000000000000..e244ef55df3d --- /dev/null +++ b/clang/test/CodeGenCXX/pragma-pack-3.cpp @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 %s -triple=i686-apple-darwin10 -emit-llvm -o - | FileCheck %s + +struct Base { + char a; +}; + +struct Derived_1 : virtual Base +{ + char b; +}; + +#pragma pack(1) +struct Derived_2 : Derived_1 { + // CHECK: %struct.Derived_2 = type <{ [5 x i8], %struct.Base }> +}; + +Derived_2 x;