From 6f2c46b58894d5a81ad7ed7654e3768c72aa0d74 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Fri, 31 Jul 2009 16:07:31 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77678 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/StmtProfile.cpp | 22 +++------------------- test/SemaTemplate/canonical-expr-type.cpp | 5 +++-- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/lib/AST/StmtProfile.cpp b/lib/AST/StmtProfile.cpp index 5a04df0406..d0f02ae95b 100644 --- a/lib/AST/StmtProfile.cpp +++ b/lib/AST/StmtProfile.cpp @@ -629,25 +629,9 @@ void StmtProfiler::VisitDecl(Decl *D) { } if (OverloadedFunctionDecl *Ovl = dyn_cast(D)) { - // Canonicalize all of the function declarations within the overload - // set. - llvm::SmallVector 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::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; } } diff --git a/test/SemaTemplate/canonical-expr-type.cpp b/test/SemaTemplate/canonical-expr-type.cpp index fec03c6076..0580c677e6 100644 --- a/test/SemaTemplate/canonical-expr-type.cpp +++ b/test/SemaTemplate/canonical-expr-type.cpp @@ -22,12 +22,13 @@ void f0a(T x, __typeof__(f(N)) y) { } // expected-note{{previous}} void f(int); template -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 -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 -- 2.40.0