r363804 - Allow copy/move assignment operator to be coroutine as per N4775
Vivek Pandya via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 19 07:12:19 PDT 2019
Author: vivekvpandya
Date: Wed Jun 19 07:12:19 2019
New Revision: 363804
URL: http://llvm.org/viewvc/llvm-project?rev=363804&view=rev
Log:
Allow copy/move assignment operator to be coroutine as per N4775
This change fixes https://bugs.llvm.org/show_bug.cgi?id=40997.
Reviewers: GorNishanov, rsmith
Reviewed by: GorNishanov
Subscribers: cfe-commits, lewissbaker, modocache, llvm-commits
Differential Revision: https://reviews.llvm.org/D63381
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=363804&r1=363803&r2=363804&view=diff
==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Jun 19 07:12:19 2019
@@ -9432,9 +9432,9 @@ def err_coroutine_outside_function : Err
"'%0' cannot be used outside a function">;
def err_coroutine_invalid_func_context : Error<
"'%1' cannot be used in %select{a constructor|a destructor"
- "|a copy assignment operator|a move assignment operator|the 'main' function"
- "|a constexpr function|a function with a deduced return type"
- "|a varargs function|a consteval function}0">;
+ "|the 'main' function|a constexpr function"
+ "|a function with a deduced return type|a varargs function"
+ "|a consteval function}0">;
def err_implied_coroutine_type_not_found : Error<
"%0 type was not found; include <experimental/coroutine> before defining "
"a coroutine">;
Modified: cfe/trunk/lib/Sema/SemaCoroutine.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCoroutine.cpp?rev=363804&r1=363803&r2=363804&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaCoroutine.cpp (original)
+++ cfe/trunk/lib/Sema/SemaCoroutine.cpp Wed Jun 19 07:12:19 2019
@@ -204,8 +204,6 @@ static bool isValidCoroutineContext(Sema
enum InvalidFuncDiag {
DiagCtor = 0,
DiagDtor,
- DiagCopyAssign,
- DiagMoveAssign,
DiagMain,
DiagConstexpr,
DiagAutoRet,
@@ -219,23 +217,15 @@ static bool isValidCoroutineContext(Sema
return false;
};
- // Diagnose when a constructor, destructor, copy/move assignment operator,
+ // Diagnose when a constructor, destructor
// or the function 'main' are declared as a coroutine.
auto *MD = dyn_cast<CXXMethodDecl>(FD);
- // [class.ctor]p6: "A constructor shall not be a coroutine."
+ // [class.ctor]p11: "A constructor shall not be a coroutine."
if (MD && isa<CXXConstructorDecl>(MD))
return DiagInvalid(DiagCtor);
// [class.dtor]p17: "A destructor shall not be a coroutine."
else if (MD && isa<CXXDestructorDecl>(MD))
return DiagInvalid(DiagDtor);
- // N4499 [special]p6: "A special member function shall not be a coroutine."
- // Per C++ [special]p1, special member functions are the "default constructor,
- // copy constructor and copy assignment operator, move constructor and move
- // assignment operator, and destructor."
- else if (MD && MD->isCopyAssignmentOperator())
- return DiagInvalid(DiagCopyAssign);
- else if (MD && MD->isMoveAssignmentOperator())
- return DiagInvalid(DiagMoveAssign);
// [basic.start.main]p3: "The function main shall not be a coroutine."
else if (FD->isMain())
return DiagInvalid(DiagMain);
Modified: cfe/trunk/test/SemaCXX/coroutines.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/coroutines.cpp?rev=363804&r1=363803&r2=363804&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/coroutines.cpp (original)
+++ cfe/trunk/test/SemaCXX/coroutines.cpp Wed Jun 19 07:12:19 2019
@@ -296,18 +296,17 @@ struct CtorDtor {
~CtorDtor() {
co_return 0; // expected-error {{'co_return' cannot be used in a destructor}}
}
- // FIXME: The spec says this is ill-formed.
void operator=(CtorDtor&) {
- co_yield 0; // expected-error {{'co_yield' cannot be used in a copy assignment operator}}
+ co_yield 0; // OK.
}
void operator=(CtorDtor const &) {
- co_yield 0; // expected-error {{'co_yield' cannot be used in a copy assignment operator}}
+ co_yield 0; // OK.
}
void operator=(CtorDtor &&) {
- co_await a; // expected-error {{'co_await' cannot be used in a move assignment operator}}
+ co_await a; // OK.
}
void operator=(CtorDtor const &&) {
- co_await a; // expected-error {{'co_await' cannot be used in a move assignment operator}}
+ co_await a; // OK.
}
void operator=(int) {
co_await a; // OK. Not a special member
More information about the cfe-commits
mailing list