Index: lib/Sema/SemaInit.cpp =================================================================== --- lib/Sema/SemaInit.cpp +++ lib/Sema/SemaInit.cpp @@ -1954,7 +1954,7 @@ } if (!VerifyOnly) - if (hasAccessibleDestructor(Base.getType(), InitLoc, SemaRef)) { + if (hasAccessibleDestructor(DeclType, InitLoc, SemaRef)) { hadError = true; return; } Index: test/SemaCXX/aggregate-initialization.cpp =================================================================== --- test/SemaCXX/aggregate-initialization.cpp +++ test/SemaCXX/aggregate-initialization.cpp @@ -219,7 +219,7 @@ struct S0 { int f; ~S0() = delete; }; // expected-note {{'~S0' has been explicitly marked deleted here}} // Check destructor of base class. - struct S3 : S0 {}; + struct S3 : S0 {}; // expected-note {{destructor of 'S3' is implicitly deleted because base class 'ElementDestructor::BaseDestructor::S0' has a deleted destructor}} void test3() { S3 s3 = {1}; // expected-error {{attempt to use a deleted function}} @@ -233,4 +233,10 @@ struct B { B(); A a; }; struct C { B b; }; C c = { B() }; + + // Zylong's destructor doesn't have to be accessible from the context of + // Yerbl's initialization. + struct Zylong { protected: ~Zylong(); }; + struct Yerbl : Zylong {}; + Yerbl y = {}; }