r253641 - [coroutines] Per latest wording paper, co_* are no longer permitted in any
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 19 18:54:01 PST 2015
Author: rsmith
Date: Thu Nov 19 20:54:01 2015
New Revision: 253641
URL: http://llvm.org/viewvc/llvm-project?rev=253641&view=rev
Log:
[coroutines] Per latest wording paper, co_* are no longer permitted in any
unevaluated operands.
Modified:
cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
cfe/trunk/lib/Sema/SemaCoroutine.cpp
cfe/trunk/test/SemaCXX/coroutines.cpp
Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=253641&r1=253640&r2=253641&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Nov 19 20:54:01 2015
@@ -7960,6 +7960,8 @@ def note_declared_coroutine_here : Note<
"'%select{co_await|co_yield|co_return}0' here">;
def err_coroutine_objc_method : Error<
"Objective-C methods as coroutines are not yet supported">;
+def err_coroutine_unevaluated_context : Error<
+ "'%0' cannot be used in an unevaluated context">;
def err_coroutine_outside_function : Error<
"'%0' cannot be used outside a function">;
def err_coroutine_ctor_dtor : Error<
Modified: cfe/trunk/lib/Sema/SemaCoroutine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCoroutine.cpp?rev=253641&r1=253640&r2=253641&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaCoroutine.cpp (original)
+++ cfe/trunk/lib/Sema/SemaCoroutine.cpp Thu Nov 19 20:54:01 2015
@@ -99,10 +99,11 @@ static QualType lookupPromiseType(Sema &
/// Check that this is a context in which a coroutine suspension can appear.
static FunctionScopeInfo *
checkCoroutineContext(Sema &S, SourceLocation Loc, StringRef Keyword) {
- // 'co_await' and 'co_yield' are permitted in unevaluated operands.
- // FIXME: Not in 'noexcept'.
- if (S.isUnevaluatedContext())
+ // 'co_await' and 'co_yield' are not permitted in unevaluated operands.
+ if (S.isUnevaluatedContext()) {
+ S.Diag(Loc, diag::err_coroutine_unevaluated_context) << Keyword;
return nullptr;
+ }
// Any other usage must be within a function.
auto *FD = dyn_cast<FunctionDecl>(S.CurContext);
@@ -206,11 +207,12 @@ ExprResult Sema::ActOnCoawaitExpr(Scope
}
ExprResult Sema::BuildCoawaitExpr(SourceLocation Loc, Expr *E) {
auto *Coroutine = checkCoroutineContext(*this, Loc, "co_await");
+ if (!Coroutine)
+ return ExprError();
if (E->getType()->isDependentType()) {
Expr *Res = new (Context) CoawaitExpr(Loc, Context.DependentTy, E);
- if (Coroutine)
- Coroutine->CoroutineStmts.push_back(Res);
+ Coroutine->CoroutineStmts.push_back(Res);
return Res;
}
@@ -230,8 +232,7 @@ ExprResult Sema::BuildCoawaitExpr(Source
Expr *Res = new (Context) CoawaitExpr(Loc, E, RSS.Results[0], RSS.Results[1],
RSS.Results[2]);
- if (Coroutine)
- Coroutine->CoroutineStmts.push_back(Res);
+ Coroutine->CoroutineStmts.push_back(Res);
return Res;
}
@@ -244,11 +245,12 @@ ExprResult Sema::ActOnCoyieldExpr(Scope
}
ExprResult Sema::BuildCoyieldExpr(SourceLocation Loc, Expr *E) {
auto *Coroutine = checkCoroutineContext(*this, Loc, "co_yield");
+ if (!Coroutine)
+ return ExprError();
// FIXME: Build await_* calls.
Expr *Res = new (Context) CoyieldExpr(Loc, Context.VoidTy, E);
- if (Coroutine)
- Coroutine->CoroutineStmts.push_back(Res);
+ Coroutine->CoroutineStmts.push_back(Res);
return Res;
}
@@ -257,11 +259,12 @@ StmtResult Sema::ActOnCoreturnStmt(Sourc
}
StmtResult Sema::BuildCoreturnStmt(SourceLocation Loc, Expr *E) {
auto *Coroutine = checkCoroutineContext(*this, Loc, "co_return");
+ if (!Coroutine)
+ return StmtError();
// FIXME: Build return_* calls.
Stmt *Res = new (Context) CoreturnStmt(Loc, E);
- if (Coroutine)
- Coroutine->CoroutineStmts.push_back(Res);
+ Coroutine->CoroutineStmts.push_back(Res);
return Res;
}
Modified: cfe/trunk/test/SemaCXX/coroutines.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/coroutines.cpp?rev=253641&r1=253640&r2=253641&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/coroutines.cpp (original)
+++ cfe/trunk/test/SemaCXX/coroutines.cpp Thu Nov 19 20:54:01 2015
@@ -78,8 +78,17 @@ struct CtorDtor {
}
};
-constexpr void constexpr_coroutine() { // expected-error {{never produces a constant expression}}
- co_yield 0; // expected-error {{'co_yield' cannot be used in a constexpr function}} expected-note {{subexpression}}
+void unevaluated() {
+ decltype(co_await a); // expected-error {{cannot be used in an unevaluated context}}
+ sizeof(co_await a); // expected-error {{cannot be used in an unevaluated context}}
+ typeid(co_await a); // expected-error {{cannot be used in an unevaluated context}}
+ decltype(co_yield a); // expected-error {{cannot be used in an unevaluated context}}
+ sizeof(co_yield a); // expected-error {{cannot be used in an unevaluated context}}
+ typeid(co_yield a); // expected-error {{cannot be used in an unevaluated context}}
+}
+
+constexpr void constexpr_coroutine() {
+ co_yield 0; // expected-error {{'co_yield' cannot be used in a constexpr function}}
}
void varargs_coroutine(const char *, ...) {
More information about the cfe-commits
mailing list