Also merge template redeclarations.

Don't require specializations (of existing and read template) to be unique.

llvm-svn: 164931
This commit is contained in:
Axel Naumann 2012-10-01 09:18:00 +00:00
parent 24d05b0f29
commit 866ba3e365
4 changed files with 30 additions and 7 deletions

View File

@ -1312,10 +1312,12 @@ ASTDeclReader::VisitRedeclarableTemplateDecl(RedeclarableTemplateDecl *D) {
D->setMemberSpecialization();
}
}
VisitTemplateDecl(D);
D->IdentifierNamespace = Record[Idx++];
mergeRedeclarable(D, Redecl);
return Redecl;
}
@ -1402,9 +1404,9 @@ void ASTDeclReader::VisitClassTemplateSpecializationDecl(
if (D->isCanonicalDecl()) { // It's kept in the folding set.
if (ClassTemplatePartialSpecializationDecl *Partial
= dyn_cast<ClassTemplatePartialSpecializationDecl>(D)) {
CanonPattern->getCommonPtr()->PartialSpecializations.InsertNode(Partial);
CanonPattern->getCommonPtr()->PartialSpecializations.GetOrInsertNode(Partial);
} else {
CanonPattern->getCommonPtr()->Specializations.InsertNode(D);
CanonPattern->getCommonPtr()->Specializations.GetOrInsertNode(D);
}
}
}
@ -1747,7 +1749,7 @@ static bool isSameEntity(NamedDecl *X, NamedDecl *Y) {
return (FuncX->getLinkage() == FuncY->getLinkage()) &&
FuncX->getASTContext().hasSameType(FuncX->getType(), FuncY->getType());
}
// Variables with the same type and linkage match.
if (VarDecl *VarX = dyn_cast<VarDecl>(X)) {
VarDecl *VarY = cast<VarDecl>(Y);
@ -1760,7 +1762,11 @@ static bool isSameEntity(NamedDecl *X, NamedDecl *Y) {
NamespaceDecl *NamespaceY = cast<NamespaceDecl>(Y);
return NamespaceX->isInline() == NamespaceY->isInline();
}
// Identical template names and kinds match.
if (isa<TemplateDecl>(X))
return true;
// FIXME: Many other cases to implement.
return false;
}
@ -2296,7 +2302,7 @@ void ASTReader::loadPendingDeclChain(serialization::GlobalDeclID ID) {
}
MergedDeclsMap::iterator MergedPos = combineStoredMergedDecls(CanonDecl, ID);
if (MergedPos != MergedDecls.end())
SearchDecls.append(MergedPos->second.begin(), MergedPos->second.end());
SearchDecls.append(MergedPos->second.begin(), MergedPos->second.end());
// Build up the list of redeclarations.
RedeclChainVisitor Visitor(*this, SearchDecls, RedeclsDeserialized, CanonID);

View File

@ -88,6 +88,13 @@ template<> class List<bool> {
public:
void push_back(int);
};
namespace N {
template<typename T> class Set {
public:
void insert(T);
};
}
#endif
// Make sure this doesn't introduce an ambiguity-creating 'id' at the

View File

@ -89,6 +89,13 @@ template<> class List<bool> {
public:
void push_back(int);
};
namespace N {
template<typename T> class Set {
public:
void insert(T);
};
}
#endif
int ONE;

View File

@ -153,6 +153,9 @@ void testVector() {
List<bool> list_bool;
list_bool.push_back(false);
N::Set<char> set_char;
set_char.insert('A');
}
#endif