]> granicus.if.org Git - clang/commitdiff
[Sema] Fix bug in handling of designated initializer.
authorAkira Hatanaka <ahatanaka@apple.com>
Tue, 17 Jan 2017 19:35:54 +0000 (19:35 +0000)
committerAkira Hatanaka <ahatanaka@apple.com>
Tue, 17 Jan 2017 19:35:54 +0000 (19:35 +0000)
CheckDesignatedInitializer wasn't taking into account the base classes
when computing the index for the field in the derived class, which
caused the test case to crash during IRGen because of a malformed AST.

rdar://problem/26795040

Differential Revision: https://reviews.llvm.org/D28705

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

lib/Sema/SemaInit.cpp
test/SemaCXX/designated-initializers-base-class.cpp [new file with mode: 0644]

index 45eff5ee6b62165fb645bd0246e7dbd61c3682ed..c385689d4c359c82c8cc57b6a0a3bbf994a3f2ce 100644 (file)
@@ -2237,6 +2237,10 @@ InitListChecker::CheckDesignatedInitializer(const InitializedEntity &Entity,
     }
 
     unsigned FieldIndex = 0;
+
+    if (auto *CXXRD = dyn_cast<CXXRecordDecl>(RT->getDecl()))
+      FieldIndex = CXXRD->getNumBases();
+
     for (auto *FI : RT->getDecl()->fields()) {
       if (FI->isUnnamedBitfield())
         continue;
diff --git a/test/SemaCXX/designated-initializers-base-class.cpp b/test/SemaCXX/designated-initializers-base-class.cpp
new file mode 100644 (file)
index 0000000..9c2e61e
--- /dev/null
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 %s -std=c++1z -fsyntax-only -verify -Winitializer-overrides
+// expected-no-diagnostics
+
+struct B {
+  int x;
+};
+
+struct D : B {
+  int y;
+};
+
+void test() { D d = {1, .y = 2}; }