]> granicus.if.org Git - clang/commitdiff
CodeGen: Skip unnamed bitfields when handling designated initializers
authorDavid Majnemer <david.majnemer@gmail.com>
Sat, 23 Aug 2014 01:48:50 +0000 (01:48 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Sat, 23 Aug 2014 01:48:50 +0000 (01:48 +0000)
We would accidently initialize unnamed bitfields instead of the
following field.

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

lib/Sema/SemaInit.cpp
test/CodeGen/designated-initializers.c

index 79fe8db23798f8525877c8aa1ef20517130f7da4..326bfc90875ad39d09ad72a185e28071543f0d3f 100644 (file)
@@ -1932,7 +1932,15 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity,
       }
     }
 
-    unsigned FieldIndex = KnownField->getFieldIndex();
+    unsigned FieldIndex = 0;
+    for (auto *FI : RT->getDecl()->fields()) {
+      if (FI->isUnnamedBitfield())
+        continue;
+      if (KnownField == FI)
+        break;
+      ++FieldIndex;
+    }
+
     RecordDecl::field_iterator Field =
         RecordDecl::field_iterator(DeclContext::decl_iterator(KnownField));
 
index b11c67a454213518339d290e3991b0e8348f1db8..74532c8fa5b438c3c618a87b5c8ac11e0206f423 100644 (file)
@@ -139,6 +139,9 @@ union_16644_t union_16644_instance_4[2] =
   [1].b[1] = 4
 };
 
+// CHECK: @lab = global { [4 x i8], i32 } { [4 x i8] undef, i32 123 }
+struct leading_anon_bitfield { int : 32; int n; } lab = { .n = 123 };
+
 void test1(int argc, char **argv)
 {
   // CHECK: internal global %struct.foo { i8* null, i32 1024 }