[coroutines] Add overloaded unary 'operator co_await'.

llvm-svn: 250991
This commit is contained in:
Richard Smith 2015-10-22 05:12:22 +00:00
parent 0f723bb90b
commit 9be594e36d
7 changed files with 29 additions and 0 deletions

View File

@ -101,6 +101,7 @@ OVERLOADED_OPERATOR_MULTI(Subscript , "[]" , false, t
// ?: can *not* be overloaded, but we need the overload // ?: can *not* be overloaded, but we need the overload
// resolution machinery for it. // resolution machinery for it.
OVERLOADED_OPERATOR_MULTI(Conditional , "?" , false, true , false) 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_MULTI
#undef OVERLOADED_OPERATOR #undef OVERLOADED_OPERATOR

View File

@ -1753,6 +1753,9 @@ CXXNameMangler::mangleOperatorName(OverloadedOperatorKind OO, unsigned Arity) {
// The conditional operator can't be overloaded, but we still handle it when // The conditional operator can't be overloaded, but we still handle it when
// mangling expressions. // mangling expressions.
case OO_Conditional: Out << "qu"; break; 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 OO_None:
case NUM_OVERLOADED_OPERATORS: case NUM_OVERLOADED_OPERATORS:

View File

@ -1046,6 +1046,14 @@ void MicrosoftCXXNameMangler::mangleOperatorName(OverloadedOperatorKind OO,
break; 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 OO_None:
case NUM_OVERLOADED_OPERATORS: case NUM_OVERLOADED_OPERATORS:
llvm_unreachable("Not an overloaded operator"); llvm_unreachable("Not an overloaded operator");

View File

@ -854,6 +854,7 @@ static Stmt::StmtClass DecodeOperatorCall(const CXXOperatorCallExpr *S,
case OO_Arrow: case OO_Arrow:
case OO_Call: case OO_Call:
case OO_Conditional: case OO_Conditional:
case OO_Coawait:
case NUM_OVERLOADED_OPERATORS: case NUM_OVERLOADED_OPERATORS:
llvm_unreachable("Invalid operator call kind"); llvm_unreachable("Invalid operator call kind");

View File

@ -6385,6 +6385,7 @@ OMPClause *Sema::ActOnOpenMPReductionClause(
case OO_Call: case OO_Call:
case OO_Subscript: case OO_Subscript:
case OO_Conditional: case OO_Conditional:
case OO_Coawait:
case NUM_OVERLOADED_OPERATORS: case NUM_OVERLOADED_OPERATORS:
llvm_unreachable("Unexpected reduction identifier"); llvm_unreachable("Unexpected reduction identifier");
case OO_None: case OO_None:

View File

@ -8228,6 +8228,7 @@ void Sema::AddBuiltinOperatorCandidates(OverloadedOperatorKind Op,
case OO_Array_New: case OO_Array_New:
case OO_Array_Delete: case OO_Array_Delete:
case OO_Call: case OO_Call:
case OO_Coawait:
llvm_unreachable( llvm_unreachable(
"Special operators don't use AddBuiltinOperatorCandidates"); "Special operators don't use AddBuiltinOperatorCandidates");

View File

@ -19,3 +19,17 @@ U f(T t) {
else else
co_return {t}; 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}}