diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-09-01 00:37:14 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-09-01 00:37:14 +0000 |
commit | 84f14dd67432bdf52a1f309466c5e16f98112329 (patch) | |
tree | d8bae9dae5471c9820d947b731abf8771d04c930 /clang/lib/Sema/SemaTemplate.cpp | |
parent | b1b2016b830ceba9eb7f251e42be9ee869116a10 (diff) | |
download | bcm5719-llvm-84f14dd67432bdf52a1f309466c5e16f98112329.tar.gz bcm5719-llvm-84f14dd67432bdf52a1f309466c5e16f98112329.zip |
Preliminary AST representation and semantic analysis for
explicitly-specified template argument lists in member reference
expressions, e.g.,
x->f<int>()
llvm-svn: 80646
Diffstat (limited to 'clang/lib/Sema/SemaTemplate.cpp')
-rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index fb25e99bc89..3985c1c0e02 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -1084,6 +1084,41 @@ Sema::OwningExprResult Sema::ActOnTemplateIdExpr(TemplateTy TemplateD, RAngleLoc); } +Sema::OwningExprResult +Sema::ActOnMemberTemplateIdReferenceExpr(Scope *S, ExprArg Base, + SourceLocation OpLoc, + tok::TokenKind OpKind, + const CXXScopeSpec &SS, + TemplateTy TemplateD, + SourceLocation TemplateNameLoc, + SourceLocation LAngleLoc, + ASTTemplateArgsPtr TemplateArgsIn, + SourceLocation *TemplateArgLocs, + SourceLocation RAngleLoc) { + TemplateName Template = TemplateD.getAsVal<TemplateName>(); + + // FIXME: We're going to end up looking up the template based on its name, + // twice! + DeclarationName Name; + if (TemplateDecl *ActualTemplate = Template.getAsTemplateDecl()) + Name = ActualTemplate->getDeclName(); + else if (OverloadedFunctionDecl *Ovl = Template.getAsOverloadedFunctionDecl()) + Name = Ovl->getDeclName(); + else + assert(false && "Cannot support dependent template names yet"); + + // Translate the parser's template argument list in our AST format. + llvm::SmallVector<TemplateArgument, 16> TemplateArgs; + translateTemplateArguments(TemplateArgsIn, TemplateArgLocs, TemplateArgs); + TemplateArgsIn.release(); + + // Do we have the save the actual template name? We might need it... + return BuildMemberReferenceExpr(S, move(Base), OpLoc, OpKind, TemplateNameLoc, + Name, true, LAngleLoc, + TemplateArgs.data(), TemplateArgs.size(), + RAngleLoc, DeclPtrTy(), &SS); +} + /// \brief Form a dependent template name. /// /// This action forms a dependent template name given the template |