From a9e29aa4b1e5042a763240899d8b8cf1267c3ec5 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Thu, 22 Oct 2009 07:19:14 +0000 Subject: [PATCH] When a template-id expression refers to a member function template, turn it into an (implicit) member access expression. Fixes PR5220 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84848 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaTemplate.cpp | 18 ++++++++++++++++++ test/SemaTemplate/member-access-expr.cpp | 15 ++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index d9c53ebec6..c691cd93a0 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/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/test/SemaTemplate/member-access-expr.cpp b/test/SemaTemplate/member-access-expr.cpp index f4922e8ff5..0a6a6bc099 100644 --- a/test/SemaTemplate/member-access-expr.cpp +++ b/test/SemaTemplate/member-access-expr.cpp @@ -74,4 +74,17 @@ void test_destruct(X2 *x2p, int *ip) { destruct(x2p); destruct(ip); destruct_intptr(ip); -} \ No newline at end of file +} + +// PR5220 +class X3 { +protected: + template float* &f0(); + template const float* &f0() const; + void f1() { + (void)static_cast(f0<0>()); + } + void f1() const{ + (void)f0<0>(); + } +};