]> granicus.if.org Git - clang/commitdiff
ConstStructBuilder: fix offset math for base classes so it works correctly in general...
authorEli Friedman <eli.friedman@gmail.com>
Fri, 30 Mar 2012 03:55:31 +0000 (03:55 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Fri, 30 Mar 2012 03:55:31 +0000 (03:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@153720 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExprConstant.cpp
test/CodeGenCXX/const-init-cxx11.cpp

index fb019f4d00abc4d404c5993a3857d35094b726d9..60cb4c5c23a0e5627fd3cd328e2cbf9343fab815 100644 (file)
@@ -469,21 +469,17 @@ void ConstStructBuilder::Build(const APValue &Val, const RecordDecl *RD,
 
     for (unsigned I = 0, N = Bases.size(); I != N; ++I) {
       BaseInfo &Base = Bases[I];
-      // Build the base class subobject at the appropriately-offset location
-      // within this object.
-      NextFieldOffsetInChars -= Base.Offset;
 
       bool IsPrimaryBase = Layout.getPrimaryBase() == Base.Decl;
       Build(Val.getStructBase(Base.Index), Base.Decl, IsPrimaryBase,
             VTable, VTableClass, Offset + Base.Offset);
-
-      NextFieldOffsetInChars += Base.Offset;
     }
   }
 
   unsigned FieldNo = 0;
   const FieldDecl *LastFD = 0;
   bool IsMsStruct = RD->hasAttr<MsStructAttr>();
+  uint64_t OffsetBits = CGM.getContext().toBits(Offset);
 
   for (RecordDecl::field_iterator Field = RD->field_begin(),
        FieldEnd = RD->field_end(); Field != FieldEnd; ++Field, ++FieldNo) {
@@ -516,10 +512,10 @@ void ConstStructBuilder::Build(const APValue &Val, const RecordDecl *RD,
 
     if (!Field->isBitField()) {
       // Handle non-bitfield members.
-      AppendField(*Field, Layout.getFieldOffset(FieldNo), EltInit);
+      AppendField(*Field, Layout.getFieldOffset(FieldNo) + OffsetBits, EltInit);
     } else {
       // Otherwise we have a bitfield.
-      AppendBitField(*Field, Layout.getFieldOffset(FieldNo),
+      AppendBitField(*Field, Layout.getFieldOffset(FieldNo) + OffsetBits,
                      cast<llvm::ConstantInt>(EltInit));
     }
   }
index 8d92b81feb070e095ce61d317397f45044424acf..c6250c6d96686bc0b42dd0d41cd1e001f5359190 100644 (file)
@@ -78,6 +78,11 @@ namespace BaseClass {
   struct Test2 : X<E,0>, X<E,1>, X<E,2>, X<E,3> {};
   // CHECK: @_ZN9BaseClass2t2E = constant {{.*}} undef
   extern constexpr Test2 t2 = Test2();
+
+  struct __attribute((packed)) PackedD { double y = 2; };
+  struct Test3 : C, PackedD { constexpr Test3() {} };
+  // CHECK: @_ZN9BaseClass2t3E = constant <{ i8, double }> <{ i8 1, double 2.000000e+00 }>
+  extern constexpr Test3 t3 = Test3();
 }
 
 namespace Array {