r253731 - [coroutines] Better handling of placeholder types.
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Fri Nov 20 14:57:25 PST 2015
Author: rsmith
Date: Fri Nov 20 16:57:24 2015
New Revision: 253731
URL: http://llvm.org/viewvc/llvm-project?rev=253731&view=rev
Log:
[coroutines] Better handling of placeholder types.
Modified:
cfe/trunk/lib/Sema/SemaCoroutine.cpp
cfe/trunk/test/SemaCXX/coroutines.cpp
Modified: cfe/trunk/lib/Sema/SemaCoroutine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCoroutine.cpp?rev=253731&r1=253730&r2=253731&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaCoroutine.cpp (original)
+++ cfe/trunk/lib/Sema/SemaCoroutine.cpp Fri Nov 20 16:57:24 2015
@@ -209,6 +209,12 @@ static ReadySuspendResumeResult buildCoa
}
ExprResult Sema::ActOnCoawaitExpr(Scope *S, SourceLocation Loc, Expr *E) {
+ if (E->getType()->isPlaceholderType()) {
+ ExprResult R = CheckPlaceholderExpr(E);
+ if (R.isInvalid()) return ExprError();
+ E = R.get();
+ }
+
ExprResult Awaitable = buildOperatorCoawaitCall(*this, S, Loc, E);
if (Awaitable.isInvalid())
return ExprError();
@@ -219,18 +225,18 @@ ExprResult Sema::BuildCoawaitExpr(Source
if (!Coroutine)
return ExprError();
- if (E->getType()->isDependentType()) {
- Expr *Res = new (Context) CoawaitExpr(Loc, Context.DependentTy, E);
- Coroutine->CoroutineStmts.push_back(Res);
- return Res;
- }
-
if (E->getType()->isPlaceholderType()) {
ExprResult R = CheckPlaceholderExpr(E);
if (R.isInvalid()) return ExprError();
E = R.get();
}
+ if (E->getType()->isDependentType()) {
+ Expr *Res = new (Context) CoawaitExpr(Loc, Context.DependentTy, E);
+ Coroutine->CoroutineStmts.push_back(Res);
+ return Res;
+ }
+
// FIXME: If E is a prvalue, create a temporary.
// FIXME: If E is an xvalue, convert to lvalue.
@@ -261,6 +267,12 @@ static ExprResult buildYieldValueCall(Se
}
ExprResult Sema::ActOnCoyieldExpr(Scope *S, SourceLocation Loc, Expr *E) {
+ if (E->getType()->isPlaceholderType()) {
+ ExprResult R = CheckPlaceholderExpr(E);
+ if (R.isInvalid()) return ExprError();
+ E = R.get();
+ }
+
auto *Coroutine = checkCoroutineContext(*this, Loc, "co_yield");
if (!Coroutine)
return ExprError();
@@ -282,6 +294,12 @@ ExprResult Sema::BuildCoyieldExpr(Source
if (!Coroutine)
return ExprError();
+ if (E->getType()->isPlaceholderType()) {
+ ExprResult R = CheckPlaceholderExpr(E);
+ if (R.isInvalid()) return ExprError();
+ E = R.get();
+ }
+
// FIXME: Build await_* calls.
Expr *Res = new (Context) CoyieldExpr(Loc, Context.VoidTy, E);
Coroutine->CoroutineStmts.push_back(Res);
@@ -292,6 +310,12 @@ StmtResult Sema::ActOnCoreturnStmt(Sourc
return BuildCoreturnStmt(Loc, E);
}
StmtResult Sema::BuildCoreturnStmt(SourceLocation Loc, Expr *E) {
+ if (E && E->getType()->isPlaceholderType()) {
+ ExprResult R = CheckPlaceholderExpr(E);
+ if (R.isInvalid()) return StmtError();
+ E = R.get();
+ }
+
auto *Coroutine = checkCoroutineContext(*this, Loc, "co_return");
if (!Coroutine)
return StmtError();
Modified: cfe/trunk/test/SemaCXX/coroutines.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/coroutines.cpp?rev=253731&r1=253730&r2=253731&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/coroutines.cpp (original)
+++ cfe/trunk/test/SemaCXX/coroutines.cpp Fri Nov 20 16:57:24 2015
@@ -140,3 +140,18 @@ namespace dependent_operator_co_await_lo
template void await_template(outer); // expected-note {{instantiation}}
template void await_template_2(outer);
}
+
+namespace placeholder {
+ awaitable f(), f(int); // expected-note 2{{possible target}}
+ int g(), g(int); // expected-note 4{{possible target}}
+ void x() {
+ co_await f; // expected-error {{reference to overloaded function}}
+ }
+ void y() {
+ co_yield g; // expected-error {{reference to overloaded function}}
+ }
+ void z() {
+ co_await a;
+ co_return g; // expected-error {{reference to overloaded function}}
+ }
+}
More information about the cfe-commits
mailing list