Make canonicalization of overloaded function declarations match the

Itanium C++ ABI's name mangling, since both are related to the notion
of "equivalent" function templates.

llvm-svn: 77678
This commit is contained in:
Douglas Gregor 2009-07-31 16:07:31 +00:00
parent c97f09f565
commit 1d1d16c43e
2 changed files with 6 additions and 21 deletions

View File

@ -629,25 +629,9 @@ void StmtProfiler::VisitDecl(Decl *D) {
}
if (OverloadedFunctionDecl *Ovl = dyn_cast<OverloadedFunctionDecl>(D)) {
// Canonicalize all of the function declarations within the overload
// set.
llvm::SmallVector<Decl *, 4> Functions;
for (OverloadedFunctionDecl::function_iterator F = Ovl->function_begin(),
FEnd = Ovl->function_end();
F != FEnd; ++F)
Functions.push_back(F->get()->getCanonicalDecl());
// Sorting the functions based on the point means that the ID generated
// will be different from one execution of the compiler to another.
// Since these IDs don't persist over time, the change in ordering will
// not affect compilation.
std::sort(Functions.begin(), Functions.end());
for (llvm::SmallVector<Decl *, 4>::iterator F = Functions.begin(),
FEnd = Functions.end();
F != FEnd; ++F)
VisitDecl(*F);
// The Itanium C++ ABI mangles references to a set of overloaded
// functions using just the function name, so we do the same here.
VisitName(Ovl->getDeclName());
return;
}
}

View File

@ -22,12 +22,13 @@ void f0a(T x, __typeof__(f(N)) y) { } // expected-note{{previous}}
void f(int);
template<typename T, T N>
void f0a(T x, __typeof__(f(N)) y) { } // expected-error{{redefinition}}
void f0a(T x, __typeof__(f(N)) y) { } // expected-error{{redefinition}} \
// expected-note{{previous}}
void f(float);
template<typename T, T N>
void f0a(T x, __typeof__(f(N)) y) { }
void f0a(T x, __typeof__(f(N)) y) { } // expected-error{{redefinition}}
// Test dependently-sized array canonicalization
template<typename T, int N, int M>