diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 45eff5ee6b62165fb645bd0246e7dbd61c3682ed..c385689d4c359c82c8cc57b6a0a3bbf994a3f2ce 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 0000000000000000000000000000000000000000..9c2e61ea2a6a86cc9a65254f414ae01180325118 --- /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}; }