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/SemaExpr.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/SemaExpr.cpp')
| -rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index df94f20af7d..d272be97654 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -885,7 +885,10 @@ static MemberExpr *BuildMemberExpr(ASTContext &C, Expr *Base, bool isArrow, if (SS && SS->isSet()) return MemberExpr::Create(C, Base, isArrow, (NestedNameSpecifier *)SS->getScopeRep(), - SS->getRange(), Member, Loc, Ty); + SS->getRange(), Member, Loc, + // FIXME: Explicit template argument lists + false, SourceLocation(), 0, 0, SourceLocation(), + Ty); return new (C) MemberExpr(Base, isArrow, Member, Loc, Ty); } @@ -1980,6 +1983,11 @@ Action::OwningExprResult Sema::BuildMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc, tok::TokenKind OpKind, SourceLocation MemberLoc, DeclarationName MemberName, + bool HasExplicitTemplateArgs, + SourceLocation LAngleLoc, + const TemplateArgument *ExplicitTemplateArgs, + unsigned NumExplicitTemplateArgs, + SourceLocation RAngleLoc, DeclPtrTy ObjCImpDecl, const CXXScopeSpec *SS) { if (SS && SS->isInvalid()) return ExprError(); @@ -2153,14 +2161,34 @@ Sema::BuildMemberReferenceExpr(Scope *S, ExprArg Base, SourceLocation OpLoc, if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(MemberDecl)) { MarkDeclarationReferenced(MemberLoc, MemberDecl); + + if (HasExplicitTemplateArgs) + return Owned(MemberExpr::Create(Context, BaseExpr, OpKind == tok::arrow, + (NestedNameSpecifier *)(SS? SS->getScopeRep() : 0), + SS? SS->getRange() : SourceRange(), + FunTmpl, MemberLoc, true, + LAngleLoc, ExplicitTemplateArgs, + NumExplicitTemplateArgs, RAngleLoc, + Context.OverloadTy)); + return Owned(BuildMemberExpr(Context, BaseExpr, OpKind == tok::arrow, SS, FunTmpl, MemberLoc, Context.OverloadTy)); } if (OverloadedFunctionDecl *Ovl - = dyn_cast<OverloadedFunctionDecl>(MemberDecl)) + = dyn_cast<OverloadedFunctionDecl>(MemberDecl)) { + if (HasExplicitTemplateArgs) + return Owned(MemberExpr::Create(Context, BaseExpr, OpKind == tok::arrow, + (NestedNameSpecifier *)(SS? SS->getScopeRep() : 0), + SS? SS->getRange() : SourceRange(), + Ovl, MemberLoc, true, + LAngleLoc, ExplicitTemplateArgs, + NumExplicitTemplateArgs, RAngleLoc, + Context.OverloadTy)); + return Owned(BuildMemberExpr(Context, BaseExpr, OpKind == tok::arrow, SS, Ovl, MemberLoc, Context.OverloadTy)); + } if (EnumConstantDecl *Enum = dyn_cast<EnumConstantDecl>(MemberDecl)) { MarkDeclarationReferenced(MemberLoc, MemberDecl); return Owned(BuildMemberExpr(Context, BaseExpr, OpKind == tok::arrow, SS, |

