summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-10-22 07:19:14 +0000
committerDouglas Gregor <dgregor@apple.com>2009-10-22 07:19:14 +0000
commit3c8a0cfa5bec96b8190ab2114eb38127b45a05f4 (patch)
treef45c8804df585007c8851b1c8df473398696e83a /clang
parent6493d9c27e4a0b333bed434d312c29a5f85c19a2 (diff)
downloadbcm5719-llvm-3c8a0cfa5bec96b8190ab2114eb38127b45a05f4.tar.gz
bcm5719-llvm-3c8a0cfa5bec96b8190ab2114eb38127b45a05f4.zip
When a template-id expression refers to a member function template, turn it into an (implicit) member access expression. Fixes PR5220
llvm-svn: 84848
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaTemplate.cpp18
-rw-r--r--clang/test/SemaTemplate/member-access-expr.cpp15
2 files changed, 32 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index d9c53ebec63..c691cd93a0b 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -1261,6 +1261,24 @@ Sema::OwningExprResult Sema::BuildTemplateIdExpr(TemplateName Template,
// template arguments that we have against the template name, if the template
// name refers to a single template. That's not a terribly common case,
// though.
+
+ // Cope with an implicit member access in a C++ non-static member function.
+ NamedDecl *D = Template.getAsTemplateDecl();
+ if (!D)
+ D = Template.getAsOverloadedFunctionDecl();
+
+ QualType ThisType, MemberType;
+ if (D && isImplicitMemberReference(/*FIXME:??*/0, D, TemplateNameLoc,
+ ThisType, MemberType)) {
+ Expr *This = new (Context) CXXThisExpr(SourceLocation(), ThisType);
+ return Owned(MemberExpr::Create(Context, This, true,
+ /*FIXME:*/0, /*FIXME:*/SourceRange(),
+ D, TemplateNameLoc, true,
+ LAngleLoc, TemplateArgs,
+ NumTemplateArgs, RAngleLoc,
+ Context.OverloadTy));
+ }
+
return Owned(TemplateIdRefExpr::Create(Context,
/*FIXME: New type?*/Context.OverloadTy,
/*FIXME: Necessary?*/0,
diff --git a/clang/test/SemaTemplate/member-access-expr.cpp b/clang/test/SemaTemplate/member-access-expr.cpp
index f4922e8ff52..0a6a6bc0990 100644
--- a/clang/test/SemaTemplate/member-access-expr.cpp
+++ b/clang/test/SemaTemplate/member-access-expr.cpp
@@ -74,4 +74,17 @@ void test_destruct(X2 *x2p, int *ip) {
destruct(x2p);
destruct(ip);
destruct_intptr<int>(ip);
-} \ No newline at end of file
+}
+
+// PR5220
+class X3 {
+protected:
+ template <int> float* &f0();
+ template <int> const float* &f0() const;
+ void f1() {
+ (void)static_cast<float*>(f0<0>());
+ }
+ void f1() const{
+ (void)f0<0>();
+ }
+};
OpenPOWER on IntegriCloud