diff --git a/clang/include/clang/AST/Expr.h b/clang/include/clang/AST/Expr.h --- a/clang/include/clang/AST/Expr.h +++ b/clang/include/clang/AST/Expr.h @@ -2987,9 +2987,14 @@ } /// setArg - Set the specified argument. - void setArg(unsigned Arg, Expr *ArgExpr) { + void setArg(unsigned Arg, Expr *ArgExpr, bool RecomputeDependence = true) { assert(Arg < getNumArgs() && "Arg access out of range!"); getArgs()[Arg] = ArgExpr; + if (RecomputeDependence) + setDependence(computeDependence( + this, llvm::makeArrayRef(reinterpret_cast( + getTrailingStmts() + PREARGS_START), + getNumPreArgs()))); } /// Reduce the number of arguments in this call expression. This is used for diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -1394,9 +1394,9 @@ for (unsigned I = 0; I != NumPreArgs; ++I) setPreArg(I, PreArgs[I]); for (unsigned I = 0; I != Args.size(); ++I) - setArg(I, Args[I]); + setArg(I, Args[I], false); for (unsigned I = Args.size(); I != NumArgs; ++I) - setArg(I, nullptr); + setArg(I, nullptr, false); setDependence(computeDependence(this, PreArgs)); diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -1013,7 +1013,7 @@ E->setRParenLoc(readSourceLocation()); E->setCallee(Record.readSubExpr()); for (unsigned I = 0; I != NumArgs; ++I) - E->setArg(I, Record.readSubExpr()); + E->setArg(I, Record.readSubExpr(), false); E->setADLCallKind(static_cast(Record.readInt())); if (HasFPFeatures) E->setStoredFPFeatures( diff --git a/clang/test/SemaCXX/recovery-expr-type.cpp b/clang/test/SemaCXX/recovery-expr-type.cpp --- a/clang/test/SemaCXX/recovery-expr-type.cpp +++ b/clang/test/SemaCXX/recovery-expr-type.cpp @@ -139,6 +139,7 @@ namespace test12 { // Verify we do not crash. -void fun(int *foo = no_such_function()); // expected-error {{undeclared identifier}} -void baz() { fun(); } +int fun(int *foo = no_such_function()); // expected-error {{undeclare identifier}} +void crash1() { fun(); } +void crash2() { constexpr int s = fun(); } } // namespace test12