diff --git a/clang/lib/Sema/SemaInit.cpp b/clang/lib/Sema/SemaInit.cpp index f7b53b2be210..fdb8777d41e6 100644 --- a/clang/lib/Sema/SemaInit.cpp +++ b/clang/lib/Sema/SemaInit.cpp @@ -5745,7 +5745,8 @@ InitializationSequence::Perform(Sema &S, ExprResult Res = S.PerformCopyInitialization( Element, Init.get()->getExprLoc(), Init, /*TopLevelOfInitList=*/ true); - assert(!Res.isInvalid() && "Result changed since try phase."); + if (Res.isInvalid()) + return ExprError(); Converted[i] = Res.take(); } InitListExpr *Semantic = new (S.Context) diff --git a/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp b/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp index 88571d671b07..0f7eb77c8645 100644 --- a/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp +++ b/clang/test/SemaCXX/cxx0x-initializer-stdinitializerlist.cpp @@ -208,3 +208,13 @@ namespace init_list_deduction_failure { void h() { g({f}); } // expected-error@-1 {{no matching function for call to 'g'}} } + +namespace deleted_copy { + struct X { + X(int i) {} + X(const X& x) = delete; // expected-note {{here}} + void operator=(const X& x) = delete; + }; + + std::initializer_list x{1}; // expected-error {{invokes deleted constructor}} +}