]> granicus.if.org Git - clang/commitdiff
Fix regression with @encode string. rdar://9624314.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 17 Jun 2011 23:19:38 +0000 (23:19 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Fri, 17 Jun 2011 23:19:38 +0000 (23:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@133312 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ASTContext.cpp
test/CodeGenObjCXX/encode.mm

index fac2eacc4f088f26b792c8eb929f1e0acd5439d2..535f418ef306113dd9439e54e0c318b9e70f832a 100644 (file)
@@ -4511,6 +4511,8 @@ void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
            BE = CXXRec->bases_end(); BI != BE; ++BI) {
       if (!BI->isVirtual()) {
         CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl();
+        if (base->isEmpty())
+          continue;
         uint64_t offs = layout.getBaseClassOffsetInBits(base);
         FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
                                   std::make_pair(offs, base));
@@ -4532,6 +4534,8 @@ void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
            BI = CXXRec->vbases_begin(),
            BE = CXXRec->vbases_end(); BI != BE; ++BI) {
       CXXRecordDecl *base = BI->getType()->getAsCXXRecordDecl();
+      if (base->isEmpty())
+        continue;
       uint64_t offs = layout.getVBaseClassOffsetInBits(base);
       FieldOrBaseOffsets.insert(FieldOrBaseOffsets.upper_bound(offs),
                                 std::make_pair(offs, base));
@@ -4595,8 +4599,8 @@ void ASTContext::getObjCEncodingForStructureImpl(RecordDecl *RDecl,
       // expands virtual bases each time one is encountered in the hierarchy,
       // making the encoding type bigger than it really is.
       getObjCEncodingForStructureImpl(base, S, FD, /*includeVBases*/false);
-      if (!base->isEmpty())
-        CurOffs += toBits(getASTRecordLayout(base).getNonVirtualSize());
+      assert(!base->isEmpty());
+      CurOffs += toBits(getASTRecordLayout(base).getNonVirtualSize());
     } else {
       FieldDecl *field = cast<FieldDecl>(dcl);
       if (FD) {
index dce3d70665def29436d602b028f2f387be3fbdfe..2c10fbcb97531634445681c516f83bba53aa04ab 100644 (file)
@@ -91,6 +91,20 @@ namespace rdar9357400 {
   const char gg[] = @encode(vector4f);
 }
 
+// rdar://9624314
+namespace rdar9624314 {
+  struct B2 { int x; };
+  struct B3 {};
+  struct S : B2, B3 {};
+
+  // CHECK: @_ZN11rdar9624314L2ggE = internal constant [6 x i8] c"{S=i}\00"
+  const char gg[] = @encode(S);
+
+  struct S2 { unsigned : 0; int x; unsigned : 0; };
+  // CHECK: @_ZN11rdar9624314L2g2E = internal constant [11 x i8] c"{S2=b0ib0}\00"
+  const char g2[] = @encode(S2);
+}
+
 struct Base1 {
   char x;
 };