Also merge template redeclarations.
Don't require specializations (of existing and read template) to be unique. llvm-svn: 164931
This commit is contained in:
parent
24d05b0f29
commit
866ba3e365
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue