forked from OSchip/llvm-project
[Coroutines] Fix assertion about uncorrected typos in co_await/co_yield/co_return expressions
llvm-svn: 282792
This commit is contained in:
parent
fa47ff3349
commit
a546528d7b
|
@ -213,6 +213,11 @@ static ReadySuspendResumeResult buildCoawaitCalls(Sema &S, SourceLocation Loc,
|
|||
}
|
||||
|
||||
ExprResult Sema::ActOnCoawaitExpr(Scope *S, SourceLocation Loc, Expr *E) {
|
||||
auto *Coroutine = checkCoroutineContext(*this, Loc, "co_await");
|
||||
if (!Coroutine) {
|
||||
CorrectDelayedTyposInExpr(E);
|
||||
return ExprError();
|
||||
}
|
||||
if (E->getType()->isPlaceholderType()) {
|
||||
ExprResult R = CheckPlaceholderExpr(E);
|
||||
if (R.isInvalid()) return ExprError();
|
||||
|
@ -222,6 +227,7 @@ ExprResult Sema::ActOnCoawaitExpr(Scope *S, SourceLocation Loc, Expr *E) {
|
|||
ExprResult Awaitable = buildOperatorCoawaitCall(*this, S, Loc, E);
|
||||
if (Awaitable.isInvalid())
|
||||
return ExprError();
|
||||
|
||||
return BuildCoawaitExpr(Loc, Awaitable.get());
|
||||
}
|
||||
ExprResult Sema::BuildCoawaitExpr(SourceLocation Loc, Expr *E) {
|
||||
|
@ -275,8 +281,10 @@ static ExprResult buildPromiseCall(Sema &S, FunctionScopeInfo *Coroutine,
|
|||
|
||||
ExprResult Sema::ActOnCoyieldExpr(Scope *S, SourceLocation Loc, Expr *E) {
|
||||
auto *Coroutine = checkCoroutineContext(*this, Loc, "co_yield");
|
||||
if (!Coroutine)
|
||||
if (!Coroutine) {
|
||||
CorrectDelayedTyposInExpr(E);
|
||||
return ExprError();
|
||||
}
|
||||
|
||||
// Build yield_value call.
|
||||
ExprResult Awaitable =
|
||||
|
@ -325,6 +333,11 @@ ExprResult Sema::BuildCoyieldExpr(SourceLocation Loc, Expr *E) {
|
|||
}
|
||||
|
||||
StmtResult Sema::ActOnCoreturnStmt(SourceLocation Loc, Expr *E) {
|
||||
auto *Coroutine = checkCoroutineContext(*this, Loc, "co_return");
|
||||
if (!Coroutine) {
|
||||
CorrectDelayedTyposInExpr(E);
|
||||
return StmtError();
|
||||
}
|
||||
return BuildCoreturnStmt(Loc, E);
|
||||
}
|
||||
StmtResult Sema::BuildCoreturnStmt(SourceLocation Loc, Expr *E) {
|
||||
|
|
|
@ -1,5 +1,22 @@
|
|||
// RUN: %clang_cc1 -std=c++14 -fcoroutines -verify %s
|
||||
|
||||
void no_coroutine_traits_bad_arg_await() {
|
||||
co_await a; // expected-error {{include <coroutine>}}
|
||||
// expected-error@-1 {{use of undeclared identifier 'a'}}
|
||||
}
|
||||
|
||||
void no_coroutine_traits_bad_arg_yield() {
|
||||
co_yield a; // expected-error {{include <coroutine>}}
|
||||
// expected-error@-1 {{use of undeclared identifier 'a'}}
|
||||
}
|
||||
|
||||
|
||||
void no_coroutine_traits_bad_arg_return() {
|
||||
co_return a; // expected-error {{include <coroutine>}}
|
||||
// expected-error@-1 {{use of undeclared identifier 'a'}}
|
||||
}
|
||||
|
||||
|
||||
struct awaitable {
|
||||
bool await_ready();
|
||||
void await_suspend(); // FIXME: coroutine_handle
|
||||
|
|
Loading…
Reference in New Issue