forked from OSchip/llvm-project
[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 llvm-svn: 282973
This commit is contained in:
parent
7022b94687
commit
7d5773e610
|
@ -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<
|
||||
|
|
|
@ -127,6 +127,11 @@ checkCoroutineContext(Sema &S, SourceLocation Loc, StringRef Keyword) {
|
|||
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");
|
||||
|
|
|
@ -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}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue