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
This commit is contained in:
Douglas Gregor 2009-10-22 07:19:14 +00:00
Родитель e961afbf3f
Коммит a9e29aa4b1
2 изменённых файлов: 32 добавлений и 1 удалений

Просмотреть файл

@ -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,

Просмотреть файл

@ -74,4 +74,17 @@ void test_destruct(X2 *x2p, int *ip) {
destruct(x2p);
destruct(ip);
destruct_intptr<int>(ip);
}
}
// 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>();
}
};