forked from OSchip/llvm-project
Implement proper substitution for OverloadedFunctionDecls, but substituting each of the functions in the overload set
llvm-svn: 80692
This commit is contained in:
parent
0f20a5b338
commit
2ffd96549d
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue