[AST][RecoveryAST] Preseve more invalid return stmt.

suppress the diagnostics for missing return stmt in constexpr func.

Differential Revision: https://reviews.llvm.org/D82284
This commit is contained in:
Haojian Wu 2020-11-30 09:25:51 +01:00
parent 699d17d4d6
commit c219282854
3 changed files with 6 additions and 5 deletions

View File

@ -3629,7 +3629,8 @@ Sema::ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp,
Scope *CurScope) {
// Correct typos, in case the containing function returns 'auto' and
// RetValExp should determine the deduced type.
ExprResult RetVal = CorrectDelayedTyposInExpr(RetValExp);
ExprResult RetVal = CorrectDelayedTyposInExpr(
RetValExp, nullptr, /*RecoverUncorrectedTypos=*/true);
if (RetVal.isInvalid())
return StmtError();
StmtResult R = BuildReturnStmt(ReturnLoc, RetVal.get());

View File

@ -1807,11 +1807,10 @@ namespace PR15884 {
}
namespace AfterError {
// FIXME: Suppress the 'no return statements' diagnostic if the body is invalid.
constexpr int error() { // expected-error {{no return statement}}
constexpr int error() {
return foobar; // expected-error {{undeclared identifier}}
}
constexpr int k = error();
constexpr int k = error(); // expected-error {{constexpr variable 'k' must be initialized by a constant expression}}
}
namespace std {

View File

@ -16,7 +16,8 @@ template <class A> struct is_same<A,A> { static constexpr bool value = true; };
auto L1 = [] { return s; }; // expected-error {{use of undeclared identifier 's'}}
using T1 = decltype(L1());
static_assert(is_same<T1, void>::value, "Return statement should be discarded");
// FIXME: Suppress the 'undeclared identifier T1' diagnostic, the UsingDecl T1 is discarded because of an invalid L1().
static_assert(is_same<T1, void>::value, "Return statement should be discarded"); // expected-error {{use of undeclared identifier 'T1'}}
auto L2 = [] { return tes; }; // expected-error {{use of undeclared identifier 'tes'; did you mean 'test'?}}
using T2 = decltype(L2());
static_assert(is_same<T2, int>::value, "Return statement was corrected");