From: Vivek Pandya Date: Wed, 19 Jun 2019 14:12:19 +0000 (+0000) Subject: Allow copy/move assignment operator to be coroutine as per N4775 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=613e830b17b2b2e29064c93b6ed99a5be5fc43fc;p=clang 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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@363804 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 019518204a..9cb2a769f4 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -9432,9 +9432,9 @@ def err_coroutine_outside_function : Error< "'%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 before defining " "a coroutine">; diff --git a/lib/Sema/SemaCoroutine.cpp b/lib/Sema/SemaCoroutine.cpp index fc6470617c..f0347af6a1 100644 --- a/lib/Sema/SemaCoroutine.cpp +++ b/lib/Sema/SemaCoroutine.cpp @@ -204,8 +204,6 @@ static bool isValidCoroutineContext(Sema &S, SourceLocation Loc, enum InvalidFuncDiag { DiagCtor = 0, DiagDtor, - DiagCopyAssign, - DiagMoveAssign, DiagMain, DiagConstexpr, DiagAutoRet, @@ -219,23 +217,15 @@ static bool isValidCoroutineContext(Sema &S, SourceLocation Loc, 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(FD); - // [class.ctor]p6: "A constructor shall not be a coroutine." + // [class.ctor]p11: "A constructor shall not be a coroutine." if (MD && isa(MD)) return DiagInvalid(DiagCtor); // [class.dtor]p17: "A destructor shall not be a coroutine." else if (MD && isa(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); diff --git a/test/SemaCXX/coroutines.cpp b/test/SemaCXX/coroutines.cpp index 1286ca4628..c8de7b0178 100644 --- a/test/SemaCXX/coroutines.cpp +++ b/test/SemaCXX/coroutines.cpp @@ -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