]> granicus.if.org Git - clang/commitdiff
[coroutines] Add overloaded unary 'operator co_await'.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 22 Oct 2015 05:12:22 +0000 (05:12 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 22 Oct 2015 05:12:22 +0000 (05:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@250991 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/OperatorKinds.def
lib/AST/ItaniumMangle.cpp
lib/AST/MicrosoftMangle.cpp
lib/AST/StmtProfile.cpp
lib/Sema/SemaOpenMP.cpp
lib/Sema/SemaOverload.cpp
test/Parser/cxx1z-coroutines.cpp

index d011e9d39ff8cc44ecae951ecc81465d1331b820..34ad7644cd2bafa480d9253cd81e368e582c2118 100644 (file)
@@ -101,6 +101,7 @@ OVERLOADED_OPERATOR_MULTI(Subscript      , "[]"                       , false, t
 // ?: can *not* be overloaded, but we need the overload
 // resolution machinery for it.
 OVERLOADED_OPERATOR_MULTI(Conditional    , "?"                        , false, true , false)
+OVERLOADED_OPERATOR(Coawait              , "co_await", kw_co_await    , true , false, false)
 
 #undef OVERLOADED_OPERATOR_MULTI
 #undef OVERLOADED_OPERATOR
index 64f9ccd9967387f51ac23b6f5d4f9f108113bd55..86bc8e67756db549a16910fb3ebb37ed731bdd68 100644 (file)
@@ -1753,6 +1753,9 @@ CXXNameMangler::mangleOperatorName(OverloadedOperatorKind OO, unsigned Arity) {
   // The conditional operator can't be overloaded, but we still handle it when
   // mangling expressions.
   case OO_Conditional: Out << "qu"; break;
+  // Proposal on cxx-abi-dev, 2015-10-21.
+  //              ::= aw        # co_await
+  case OO_Coawait: Out << "aw"; break;
 
   case OO_None:
   case NUM_OVERLOADED_OPERATORS:
index 9d6c7dc64f8c0285e0ad2c708cb4349527a554a7..c4baed21cb432b3fd98263e5828160e8cf6a7383 100644 (file)
@@ -1046,6 +1046,14 @@ void MicrosoftCXXNameMangler::mangleOperatorName(OverloadedOperatorKind OO,
     break;
   }
 
+  case OO_Coawait: {
+    DiagnosticsEngine &Diags = Context.getDiags();
+    unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
+      "cannot mangle this operator co_await yet");
+    Diags.Report(Loc, DiagID);
+    break;
+  }
+
   case OO_None:
   case NUM_OVERLOADED_OPERATORS:
     llvm_unreachable("Not an overloaded operator");
index cf5289adc2c37926494e058b19af2b8367eb0243..93b80e5d99cb4c5036ad40587469d1e98ca6eccb 100644 (file)
@@ -854,6 +854,7 @@ static Stmt::StmtClass DecodeOperatorCall(const CXXOperatorCallExpr *S,
   case OO_Arrow:
   case OO_Call:
   case OO_Conditional:
+  case OO_Coawait:
   case NUM_OVERLOADED_OPERATORS:
     llvm_unreachable("Invalid operator call kind");
       
index c4e1b26e7c5f3156cd313778a48ced41aab238f6..705e6f5ef0a35c924a4df382d174d180db28520a 100644 (file)
@@ -6385,6 +6385,7 @@ OMPClause *Sema::ActOnOpenMPReductionClause(
   case OO_Call:
   case OO_Subscript:
   case OO_Conditional:
+  case OO_Coawait:
   case NUM_OVERLOADED_OPERATORS:
     llvm_unreachable("Unexpected reduction identifier");
   case OO_None:
index 743ca680427c1282beff5da59b1307921ded40fd..d4a220037ec5f9f7d4d13a0c273d78abb3040168 100644 (file)
@@ -8228,6 +8228,7 @@ void Sema::AddBuiltinOperatorCandidates(OverloadedOperatorKind Op,
   case OO_Array_New:
   case OO_Array_Delete:
   case OO_Call:
+  case OO_Coawait:
     llvm_unreachable(
                     "Special operators don't use AddBuiltinOperatorCandidates");
 
index 266337634e96522d1fb67065e181302417a1874a..3e698404a60037ec6977e96dbaa13c1524325ce7 100644 (file)
@@ -19,3 +19,17 @@ U f(T t) {
   else
     co_return {t};
 }
+
+struct Y {};
+struct X { Y operator co_await(); };
+struct Z {};
+Y operator co_await(Z);
+
+void f(X x, Z z) {
+  x.operator co_await();
+  operator co_await(z);
+}
+
+void operator co_await(); // expected-error {{must have at least one parameter}}
+void operator co_await(X, Y, Z); // expected-error {{must be a unary operator}}
+void operator co_await(int); // expected-error {{parameter of class or enumeration type}}