summaryrefslogtreecommitdiffstats
path: root/clang/lib/Parse/ParseExpr.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-08-31 21:16:32 +0000
committerDouglas Gregor <dgregor@apple.com>2009-08-31 21:16:32 +0000
commitfbc1823451449005dd486e978460feb5de87b333 (patch)
tree45aa2cc5bff61cda3a7d95d1e9225b1d6d33c929 /clang/lib/Parse/ParseExpr.cpp
parentcc2f1eb7fe9bc10a835002196ee268bdd5226b5e (diff)
downloadbcm5719-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.cpp25
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);
OpenPOWER on IntegriCloud