From 372e5e8bd8e29b1beaec13968e50fddd4b5bb948 Mon Sep 17 00:00:00 2001 From: Akira Hatanaka <ahatanaka@apple.com> Date: Tue, 17 Jan 2017 19:35:54 +0000 Subject: [PATCH] [Sema] Fix bug in handling of designated initializer. 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 | 4 ++++ test/SemaCXX/designated-initializers-base-class.cpp | 12 ++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 test/SemaCXX/designated-initializers-base-class.cpp diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 45eff5ee6b6..c385689d4c3 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -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 index 00000000000..9c2e61ea2a6 --- /dev/null +++ b/test/SemaCXX/designated-initializers-base-class.cpp @@ -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}; } -- GitLab