From 522fbc496995e3d756bd8f77d52c745c4023d733 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Mon, 31 Aug 2009 19:52:13 +0000 Subject: Support explicit C++ member operator syntax, from James Porter! llvm-svn: 80608 --- clang/lib/Parse/ParseExpr.cpp | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) (limited to 'clang/lib/Parse/ParseExpr.cpp') diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp index 80e701e17ae..d00d6d2e33d 100644 --- a/clang/lib/Parse/ParseExpr.cpp +++ b/clang/lib/Parse/ParseExpr.cpp @@ -939,6 +939,7 @@ Parser::ParsePostfixExpressionSuffix(OwningExprResult LHS) { OpKind, Tok.getLocation(), *Tok.getIdentifierInfo(), ObjCImpDecl, &SS); + ConsumeToken(); } else if (getLang().CPlusPlus && Tok.is(tok::tilde)) { // We have a C++ pseudo-destructor. @@ -946,6 +947,8 @@ Parser::ParsePostfixExpressionSuffix(OwningExprResult LHS) { ConsumeToken(); if (!Tok.is(tok::identifier)) { + if (getLang().CPlusPlus) + Actions.ActOnCXXExitMemberScope(CurScope, MemberSS); Diag(Tok, diag::err_expected_ident); return ExprError(); } @@ -956,15 +959,39 @@ Parser::ParsePostfixExpressionSuffix(OwningExprResult LHS) { Tok.getLocation(), Tok.getIdentifierInfo(), &SS); + ConsumeToken(); + } else if (getLang().CPlusPlus && Tok.is(tok::kw_operator)) { + if (OverloadedOperatorKind Op = TryParseOperatorFunctionId()) { + if (!LHS.isInvalid()) + LHS = Actions.ActOnOverloadedOperatorReferenceExpr(CurScope, + move(LHS), OpLoc, + OpKind, + Tok.getLocation(), + Op, &SS); + // TryParseOperatorFunctionId already consumed our token, so + // don't bother + } else if (TypeTy *ConvType = ParseConversionFunctionId()) { + if (!LHS.isInvalid()) + LHS = Actions.ActOnConversionOperatorReferenceExpr(CurScope, + move(LHS), OpLoc, + OpKind, + Tok.getLocation(), + ConvType, &SS); + } else { + if (getLang().CPlusPlus) + Actions.ActOnCXXExitMemberScope(CurScope, MemberSS); + // Don't emit a diagnostic; ParseConversionFunctionId does it for us + return ExprError(); + } } else { + if (getLang().CPlusPlus) + Actions.ActOnCXXExitMemberScope(CurScope, MemberSS); Diag(Tok, diag::err_expected_ident); return ExprError(); } if (getLang().CPlusPlus) Actions.ActOnCXXExitMemberScope(CurScope, MemberSS); - - ConsumeToken(); break; } case tok::plusplus: // postfix-expression: postfix-expression '++' -- cgit v1.2.3