diff options
| author | Douglas Gregor <dgregor@apple.com> | 2009-08-31 21:16:32 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2009-08-31 21:16:32 +0000 |
| commit | fbc1823451449005dd486e978460feb5de87b333 (patch) | |
| tree | 45aa2cc5bff61cda3a7d95d1e9225b1d6d33c929 /clang/lib/Parse/ParseExpr.cpp | |
| parent | cc2f1eb7fe9bc10a835002196ee268bdd5226b5e (diff) | |
| download | bcm5719-llvm-fbc1823451449005dd486e978460feb5de87b333.tar.gz bcm5719-llvm-fbc1823451449005dd486e978460feb5de87b333.zip | |
Add parsing for references to member function templates with explicit
template argument lists, e.g., x.f<int>().
Semantic analysis will be a separate commit.
llvm-svn: 80624
Diffstat (limited to 'clang/lib/Parse/ParseExpr.cpp')
| -rw-r--r-- | clang/lib/Parse/ParseExpr.cpp | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp index d00d6d2e33d..36b6dd4a930 100644 --- a/clang/lib/Parse/ParseExpr.cpp +++ b/clang/lib/Parse/ParseExpr.cpp @@ -941,7 +941,7 @@ Parser::ParsePostfixExpressionSuffix(OwningExprResult LHS) { ObjCImpDecl, &SS); ConsumeToken(); } else if (getLang().CPlusPlus && Tok.is(tok::tilde)) { - // We have a C++ pseudo-destructor. + // We have a C++ pseudo-destructor or a destructor call, e.g., t.~T() // Consume the tilde. ConsumeToken(); @@ -961,6 +961,8 @@ Parser::ParsePostfixExpressionSuffix(OwningExprResult LHS) { &SS); ConsumeToken(); } else if (getLang().CPlusPlus && Tok.is(tok::kw_operator)) { + // We have a reference to a member operator, e.g., t.operator int or + // t.operator+. if (OverloadedOperatorKind Op = TryParseOperatorFunctionId()) { if (!LHS.isInvalid()) LHS = Actions.ActOnOverloadedOperatorReferenceExpr(CurScope, @@ -983,6 +985,27 @@ Parser::ParsePostfixExpressionSuffix(OwningExprResult LHS) { // Don't emit a diagnostic; ParseConversionFunctionId does it for us return ExprError(); } + } else if (getLang().CPlusPlus && Tok.is(tok::annot_template_id)) { + // We have a reference to a member template along with explicitly- + // specified template arguments, e.g., t.f<int>. + TemplateIdAnnotation *TemplateId + = static_cast<TemplateIdAnnotation *>(Tok.getAnnotationValue()); + if (!LHS.isInvalid()) { + ASTTemplateArgsPtr TemplateArgsPtr(Actions, + TemplateId->getTemplateArgs(), + TemplateId->getTemplateArgIsType(), + TemplateId->NumArgs); + + LHS = Actions.ActOnMemberTemplateIdReferenceExpr(CurScope, move(LHS), + OpLoc, OpKind, SS, + TemplateTy::make(TemplateId->Template), + TemplateId->TemplateNameLoc, + TemplateId->LAngleLoc, + TemplateArgsPtr, + TemplateId->getTemplateArgLocations(), + TemplateId->RAngleLoc); + } + ConsumeToken(); } else { if (getLang().CPlusPlus) Actions.ActOnCXXExitMemberScope(CurScope, MemberSS); |

