Implement proper substitution for OverloadedFunctionDecls, but substituting each of the functions in the overload set

llvm-svn: 80692
This commit is contained in:
Douglas Gregor 2009-09-01 17:53:10 +00:00
parent 0f20a5b338
commit 2ffd96549d
3 changed files with 37 additions and 11 deletions

View File

@ -465,14 +465,6 @@ TemplateInstantiator::TransformDeclRefExpr(DeclRefExpr *E) {
E->getSourceRange().getBegin()));
}
if (OverloadedFunctionDecl *Ovl = dyn_cast<OverloadedFunctionDecl>(D)) {
// FIXME: instantiate each decl in the overload set
return SemaRef.Owned(new (SemaRef.Context) DeclRefExpr(Ovl,
SemaRef.Context.OverloadTy,
E->getLocation(),
false, false));
}
NamedDecl *InstD = SemaRef.FindInstantiatedDecl(D);
if (!InstD)
return SemaRef.ExprError();

View File

@ -1347,7 +1347,22 @@ DeclContext *Sema::FindInstantiatedContext(DeclContext* DC) {
/// X<T>::<Kind>::KnownValue) to its instantiation
/// (X<int>::<Kind>::KnownValue). InstantiateCurrentDeclRef() performs
/// this mapping from within the instantiation of X<int>.
NamedDecl * Sema::FindInstantiatedDecl(NamedDecl *D) {
NamedDecl *Sema::FindInstantiatedDecl(NamedDecl *D) {
if (OverloadedFunctionDecl *Ovl = dyn_cast<OverloadedFunctionDecl>(D)) {
// Transform all of the elements of the overloaded function set.
OverloadedFunctionDecl *Result
= OverloadedFunctionDecl::Create(Context, CurContext, Ovl->getDeclName());
for (OverloadedFunctionDecl::function_iterator F = Ovl->function_begin(),
FEnd = Ovl->function_end();
F != FEnd; ++F) {
Result->addOverload(
AnyFunctionDecl::getFromNamedDecl(FindInstantiatedDecl(*F)));
}
return Result;
}
DeclContext *ParentDC = D->getDeclContext();
if (isa<ParmVarDecl>(D) || ParentDC->isFunctionOrMethod()) {
// D is a local of some kind. Look into the map of local
@ -1378,8 +1393,9 @@ NamedDecl * Sema::FindInstantiatedDecl(NamedDecl *D) {
}
ParentDC = FindInstantiatedContext(ParentDC);
if (!ParentDC) return 0;
if (!ParentDC)
return 0;
if (ParentDC != D->getDeclContext()) {
// We performed some kind of instantiation in the parent context,
// so now we need to look into the instantiated parent context to

View File

@ -160,3 +160,21 @@ namespace N9 {
template struct B<int>;
}
namespace N10 {
template <typename T>
class A {
struct X { };
public:
~A() {
f(reinterpret_cast<X *>(0), reinterpret_cast<X *>(0));
}
private:
void f(X *);
void f(X *, X *);
};
template class A<int>;
}