diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index fc1d2cd7757e12..0865b8b851384d 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -5142,8 +5142,11 @@ static EvalStmtResult EvaluateStmt(StmtResult &Result, EvalInfo &Info, case Stmt::ReturnStmtClass: { const Expr *RetExpr = cast(S)->getRetValue(); FullExpressionRAII Scope(Info); - if (RetExpr && RetExpr->isValueDependent()) - return EvaluateDependentExpr(RetExpr, Info) ? ESR_Returned : ESR_Failed; + if (RetExpr && RetExpr->isValueDependent()) { + EvaluateDependentExpr(RetExpr, Info); + // We know we returned, but we don't know what the value is. + return ESR_Failed; + } if (RetExpr && !(Result.Slot ? EvaluateInPlace(Result.Value, Info, *Result.Slot, RetExpr) diff --git a/clang/test/SemaCXX/constexpr-function-recovery-crash.cpp b/clang/test/SemaCXX/constexpr-function-recovery-crash.cpp index 48a0d97619e4e8..94be9a12bc6621 100644 --- a/clang/test/SemaCXX/constexpr-function-recovery-crash.cpp +++ b/clang/test/SemaCXX/constexpr-function-recovery-crash.cpp @@ -66,3 +66,6 @@ template constexpr int f(int y) { // expected-note {{candidate template i constexpr int test9(int x) { return f<1>(f(1)); // expected-error {{no matching function for call to 'f'}} } + +constexpr int test10() { return undef(); } // expected-error {{use of undeclared identifier 'undef'}} +static_assert(test10() <= 1, "should not crash"); // expected-error {{static_assert expression is not an integral constant expression}}