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}} + } +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits