diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -1389,6 +1389,9 @@ if (!Result.isInvalid() && Result.get()->isInstantiationDependent() && !Result.get()->isTypeDependent()) Result = CorrectDelayedTyposInExpr(Result.get()); + else if (Result.isInvalid()) + Result = CreateRecoveryExpr(TInfo->getTypeLoc().getBeginLoc(), + RParenOrBraceLoc, exprs, Ty); return Result; } diff --git a/clang/test/AST/ast-dump-recovery.cpp b/clang/test/AST/ast-dump-recovery.cpp --- a/clang/test/AST/ast-dump-recovery.cpp +++ b/clang/test/AST/ast-dump-recovery.cpp @@ -157,11 +157,14 @@ // CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors // CHECK-NEXT: `-InitListExpr Bar b2 = {1}; - // FIXME: preserve the invalid initializer. - // CHECK: `-VarDecl {{.*}} b3 'Bar' + // CHECK: `-VarDecl {{.*}} b3 'Bar' + // CHECK-NEXT: `-RecoveryExpr {{.*}} 'Bar' contains-errors + // CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int' Bar b3 = Bar(x); - // FIXME: preserve the invalid initializer. - // CHECK: `-VarDecl {{.*}} b4 'Bar' + // CHECK: `-VarDecl {{.*}} b4 'Bar' + // CHECK-NEXT: `-RecoveryExpr {{.*}} 'Bar' contains-errors + // CHECK-NEXT: `-InitListExpr {{.*}} 'void' + // CHECK-NEXT: `-DeclRefExpr {{.*}} 'x' 'int' Bar b4 = Bar{x}; // CHECK: `-VarDecl {{.*}} b5 'Bar' // CHECK-NEXT: `-CXXUnresolvedConstructExpr {{.*}} 'Bar' contains-errors 'Bar' @@ -174,6 +177,10 @@ // CHECK-NEXT: `-RecoveryExpr {{.*}} contains-errors // CHECK-NEXT: `-UnresolvedLookupExpr {{.*}} 'invalid' Bar b6 = Bar{invalid()}; + + // CHECK: `-RecoveryExpr {{.*}} 'Bar' contains-errors + // CHECK-NEXT: `-IntegerLiteral {{.*}} 'int' 1 + Bar(1); } void InitializerForAuto() { // CHECK: `-VarDecl {{.*}} invalid a 'auto' diff --git a/clang/test/SemaCXX/constant-expression-cxx11.cpp b/clang/test/SemaCXX/constant-expression-cxx11.cpp --- a/clang/test/SemaCXX/constant-expression-cxx11.cpp +++ b/clang/test/SemaCXX/constant-expression-cxx11.cpp @@ -2043,14 +2043,11 @@ X::n; // expected-note {{in evaluation of exception specification for 'BadDefaultInit::A::A' needed here}} }; - // FIXME: The "constexpr constructor must initialize all members" diagnostic - // here is bogus (we discard the k(k) initializer because the parameter 'k' - // has been marked invalid). struct B { - constexpr B( // expected-warning {{initialize all members}} + constexpr B( int k = X::n) : // expected-error {{default argument to function 'B' that is declared later}} expected-note {{here}} k(k) {} - int k; // expected-note {{not initialized}} + int k; }; } diff --git a/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp b/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp --- a/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp +++ b/clang/test/SemaCXX/cxx0x-initializer-constructor.cpp @@ -163,7 +163,7 @@ // (for the second phase, no constructor is viable) G g1{1, 2, 3}; // expected-error {{no matching constructor}} (void) new G{1, 2, 3}; // expected-error {{no matching constructor}} - (void) G{1, 2, 3} // expected-error {{no matching constructor}} + (void) G{1, 2, 3}; // expected-error {{no matching constructor}} // valid (T deduced to <>). G g2({1, 2, 3}); diff --git a/clang/test/SemaCXX/cxx1z-copy-omission.cpp b/clang/test/SemaCXX/cxx1z-copy-omission.cpp --- a/clang/test/SemaCXX/cxx1z-copy-omission.cpp +++ b/clang/test/SemaCXX/cxx1z-copy-omission.cpp @@ -106,7 +106,7 @@ sizeof(Indestructible{}); // expected-error {{deleted}} sizeof(make_indestructible()); // expected-error {{deleted}} sizeof(make_incomplete()); // expected-error {{incomplete}} - typeid(Indestructible{}); // expected-error {{deleted}} + typeid(Indestructible{}); // expected-error {{deleted}} expected-error {{you need to include }} typeid(make_indestructible()); // expected-error {{deleted}} \ // expected-error {{need to include }} typeid(make_incomplete()); // expected-error {{incomplete}} \