Author: ericwf Date: Fri Sep 30 17:38:31 2016 New Revision: 282973 URL: http://llvm.org/viewvc/llvm-project?rev=282973&view=rev Log: [coroutines] Diagnose when 'main' is declared as a coroutine.
Summary: The title says it all. Reviewers: rsmith, GorNishanov Subscribers: mehdi_amini, cfe-commits Differential Revision: https://reviews.llvm.org/D25078 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=282973&r1=282972&r2=282973&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Sep 30 17:38:31 2016 @@ -8562,6 +8562,8 @@ def err_coroutine_ctor_dtor : Error< "'%1' cannot be used in a %select{constructor|destructor}0">; def err_coroutine_constexpr : Error< "'%0' cannot be used in a constexpr function">; +def err_coroutine_main : Error< + "'main' cannot be a coroutine">; def err_coroutine_varargs : Error< "'%0' cannot be used in a varargs function">; def ext_coroutine_without_co_await_co_yield : ExtWarn< Modified: cfe/trunk/lib/Sema/SemaCoroutine.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCoroutine.cpp?rev=282973&r1=282972&r2=282973&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaCoroutine.cpp (original) +++ cfe/trunk/lib/Sema/SemaCoroutine.cpp Fri Sep 30 17:38:31 2016 @@ -127,6 +127,11 @@ checkCoroutineContext(Sema &S, SourceLoc S.Diag(Loc, diag::err_coroutine_constexpr) << Keyword; } else if (FD->isVariadic()) { S.Diag(Loc, diag::err_coroutine_varargs) << Keyword; + } else if (FD->isMain()) { + S.Diag(FD->getLocStart(), diag::err_coroutine_main); + S.Diag(Loc, diag::note_declared_coroutine_here) + << (Keyword == "co_await" ? 0 : + Keyword == "co_yield" ? 1 : 2); } else { auto *ScopeInfo = S.getCurFunction(); assert(ScopeInfo && "missing function scope for function"); Modified: cfe/trunk/test/SemaCXX/coroutines.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/coroutines.cpp?rev=282973&r1=282972&r2=282973&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/coroutines.cpp (original) +++ cfe/trunk/test/SemaCXX/coroutines.cpp Fri Sep 30 17:38:31 2016 @@ -283,3 +283,11 @@ struct bad_promise_5 { coro<bad_promise_5> bad_final_suspend() { // expected-error {{no member named 'await_ready' in 'not_awaitable'}} co_await a; } + + +template<> struct std::coroutine_traits<int, int, const char**> +{ using promise_type = promise; }; + +int main(int, const char**) { // expected-error {{'main' cannot be a coroutine}} + co_await a; // expected-note {{function is a coroutine due to use of 'co_await' here}} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits