[PATCH] D37454: [coroutines] Make sure auto return type of await_resume is properly handled
This revision was automatically updated to reflect the committed changes. Closed by commit rL312565: [coroutines] Make sure auto return type of await_resume is properly handled (authored by GorNishanov). Changed prior to commit: https://reviews.llvm.org/D37454?vs=113800=113894#toc Repository: rL LLVM https://reviews.llvm.org/D37454 Files: cfe/trunk/lib/Sema/SemaCoroutine.cpp cfe/trunk/test/SemaCXX/coroutines.cpp Index: cfe/trunk/lib/Sema/SemaCoroutine.cpp === --- cfe/trunk/lib/Sema/SemaCoroutine.cpp +++ cfe/trunk/lib/Sema/SemaCoroutine.cpp @@ -438,14 +438,14 @@ // - await-suspend is the expression e.await_suspend(h), which shall be // a prvalue of type void or bool. QualType RetType = AwaitSuspend->getCallReturnType(S.Context); + // Experimental support for coroutine_handle returning await_suspend. if (Expr *TailCallSuspend = maybeTailCall(S, RetType, AwaitSuspend, Loc)) Calls.Results[ACT::ACT_Suspend] = TailCallSuspend; else { // non-class prvalues always have cv-unqualified types - QualType AdjRetType = RetType.getUnqualifiedType(); if (RetType->isReferenceType() || - (AdjRetType != S.Context.BoolTy && AdjRetType != S.Context.VoidTy)) { + (!RetType->isBooleanType() && !RetType->isVoidType())) { S.Diag(AwaitSuspend->getCalleeDecl()->getLocation(), diag::err_await_suspend_invalid_return_type) << RetType; Index: cfe/trunk/test/SemaCXX/coroutines.cpp === --- cfe/trunk/test/SemaCXX/coroutines.cpp +++ cfe/trunk/test/SemaCXX/coroutines.cpp @@ -66,6 +66,12 @@ void await_resume() {} }; +struct auto_await_suspend { + bool await_ready(); + template auto await_suspend(F) {} + void await_resume(); +}; + struct DummyVoidTag {}; DummyVoidTag no_specialization() { // expected-error {{this function cannot be a coroutine: 'std::experimental::coroutine_traits' has no member named 'promise_type'}} co_await a; @@ -159,6 +165,10 @@ co_yield yield; // expected-error {{no member named 'await_ready' in 'not_awaitable'}} } +void check_auto_await_suspend() { + co_await auto_await_suspend{}; // Should compile successfully. +} + void coreturn(int n) { co_await a; if (n == 0) Index: cfe/trunk/lib/Sema/SemaCoroutine.cpp === --- cfe/trunk/lib/Sema/SemaCoroutine.cpp +++ cfe/trunk/lib/Sema/SemaCoroutine.cpp @@ -438,14 +438,14 @@ // - await-suspend is the expression e.await_suspend(h), which shall be // a prvalue of type void or bool. QualType RetType = AwaitSuspend->getCallReturnType(S.Context); + // Experimental support for coroutine_handle returning await_suspend. if (Expr *TailCallSuspend = maybeTailCall(S, RetType, AwaitSuspend, Loc)) Calls.Results[ACT::ACT_Suspend] = TailCallSuspend; else { // non-class prvalues always have cv-unqualified types - QualType AdjRetType = RetType.getUnqualifiedType(); if (RetType->isReferenceType() || - (AdjRetType != S.Context.BoolTy && AdjRetType != S.Context.VoidTy)) { + (!RetType->isBooleanType() && !RetType->isVoidType())) { S.Diag(AwaitSuspend->getCalleeDecl()->getLocation(), diag::err_await_suspend_invalid_return_type) << RetType; Index: cfe/trunk/test/SemaCXX/coroutines.cpp === --- cfe/trunk/test/SemaCXX/coroutines.cpp +++ cfe/trunk/test/SemaCXX/coroutines.cpp @@ -66,6 +66,12 @@ void await_resume() {} }; +struct auto_await_suspend { + bool await_ready(); + template auto await_suspend(F) {} + void await_resume(); +}; + struct DummyVoidTag {}; DummyVoidTag no_specialization() { // expected-error {{this function cannot be a coroutine: 'std::experimental::coroutine_traits' has no member named 'promise_type'}} co_await a; @@ -159,6 +165,10 @@ co_yield yield; // expected-error {{no member named 'await_ready' in 'not_awaitable'}} } +void check_auto_await_suspend() { + co_await auto_await_suspend{}; // Should compile successfully. +} + void coreturn(int n) { co_await a; if (n == 0) ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D37454: [coroutines] Make sure auto return type of await_resume is properly handled
GorNishanov marked an inline comment as done. GorNishanov added inline comments. Comment at: test/SemaCXX/coroutines.cpp:169 +void check_auto_await_suspend() { + co_await auto_await_suspend{}; // OK +} javed.absar wrote: > maybe change the comment to something more meaningful, or remove it. Sure thing. I'll remove the comment. https://reviews.llvm.org/D37454 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D37454: [coroutines] Make sure auto return type of await_resume is properly handled
javed.absar added inline comments. Comment at: test/SemaCXX/coroutines.cpp:169 +void check_auto_await_suspend() { + co_await auto_await_suspend{}; // OK +} maybe change the comment to something more meaningful, or remove it. https://reviews.llvm.org/D37454 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D37454: [coroutines] Make sure auto return type of await_resume is properly handled
GorNishanov marked an inline comment as done. GorNishanov added inline comments. Comment at: lib/Sema/SemaCoroutine.cpp:451 if (RetType->isReferenceType() || (AdjRetType != S.Context.BoolTy && AdjRetType != S.Context.VoidTy)) { S.Diag(AwaitSuspend->getCalleeDecl()->getLocation(), rsmith wrote: > Don't desugar the type; instead, use `AdjRetType->isBooleanType() || > AdjRetType->isVoidType()` here. You can also delete the > `getUnqualifiedType()` call above if you do this, and just use `RetType` > here, since `->isBooleanType()` on `const bool` returns `true`. Cool! Much shorter and prettier. Thank you! https://reviews.llvm.org/D37454 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D37454: [coroutines] Make sure auto return type of await_resume is properly handled
GorNishanov updated this revision to Diff 113800. GorNishanov retitled this revision from "[coroutines] desugar auto type of await_resume before checking whether it is void or bool" to "[coroutines] Make sure auto return type of await_resume is properly handled". GorNishanov added a comment. use isVoidType() and isBooleantType() instead of cruft that used to be there before https://reviews.llvm.org/D37454 Files: lib/Sema/SemaCoroutine.cpp test/SemaCXX/coroutines.cpp Index: test/SemaCXX/coroutines.cpp === --- test/SemaCXX/coroutines.cpp +++ test/SemaCXX/coroutines.cpp @@ -66,6 +66,12 @@ void await_resume() {} }; +struct auto_await_suspend { + bool await_ready(); + template auto await_suspend(F) {} + void await_resume(); +}; + struct DummyVoidTag {}; DummyVoidTag no_specialization() { // expected-error {{this function cannot be a coroutine: 'std::experimental::coroutine_traits' has no member named 'promise_type'}} co_await a; @@ -159,6 +165,10 @@ co_yield yield; // expected-error {{no member named 'await_ready' in 'not_awaitable'}} } +void check_auto_await_suspend() { + co_await auto_await_suspend{}; // OK +} + void coreturn(int n) { co_await a; if (n == 0) Index: lib/Sema/SemaCoroutine.cpp === --- lib/Sema/SemaCoroutine.cpp +++ lib/Sema/SemaCoroutine.cpp @@ -438,14 +438,14 @@ // - await-suspend is the expression e.await_suspend(h), which shall be // a prvalue of type void or bool. QualType RetType = AwaitSuspend->getCallReturnType(S.Context); + // Experimental support for coroutine_handle returning await_suspend. if (Expr *TailCallSuspend = maybeTailCall(S, RetType, AwaitSuspend, Loc)) Calls.Results[ACT::ACT_Suspend] = TailCallSuspend; else { // non-class prvalues always have cv-unqualified types - QualType AdjRetType = RetType.getUnqualifiedType(); if (RetType->isReferenceType() || - (AdjRetType != S.Context.BoolTy && AdjRetType != S.Context.VoidTy)) { + (!RetType->isBooleanType() && !RetType->isVoidType())) { S.Diag(AwaitSuspend->getCalleeDecl()->getLocation(), diag::err_await_suspend_invalid_return_type) << RetType; Index: test/SemaCXX/coroutines.cpp === --- test/SemaCXX/coroutines.cpp +++ test/SemaCXX/coroutines.cpp @@ -66,6 +66,12 @@ void await_resume() {} }; +struct auto_await_suspend { + bool await_ready(); + template auto await_suspend(F) {} + void await_resume(); +}; + struct DummyVoidTag {}; DummyVoidTag no_specialization() { // expected-error {{this function cannot be a coroutine: 'std::experimental::coroutine_traits' has no member named 'promise_type'}} co_await a; @@ -159,6 +165,10 @@ co_yield yield; // expected-error {{no member named 'await_ready' in 'not_awaitable'}} } +void check_auto_await_suspend() { + co_await auto_await_suspend{}; // OK +} + void coreturn(int n) { co_await a; if (n == 0) Index: lib/Sema/SemaCoroutine.cpp === --- lib/Sema/SemaCoroutine.cpp +++ lib/Sema/SemaCoroutine.cpp @@ -438,14 +438,14 @@ // - await-suspend is the expression e.await_suspend(h), which shall be // a prvalue of type void or bool. QualType RetType = AwaitSuspend->getCallReturnType(S.Context); + // Experimental support for coroutine_handle returning await_suspend. if (Expr *TailCallSuspend = maybeTailCall(S, RetType, AwaitSuspend, Loc)) Calls.Results[ACT::ACT_Suspend] = TailCallSuspend; else { // non-class prvalues always have cv-unqualified types - QualType AdjRetType = RetType.getUnqualifiedType(); if (RetType->isReferenceType() || - (AdjRetType != S.Context.BoolTy && AdjRetType != S.Context.VoidTy)) { + (!RetType->isBooleanType() && !RetType->isVoidType())) { S.Diag(AwaitSuspend->getCalleeDecl()->getLocation(), diag::err_await_suspend_invalid_return_type) << RetType; ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits