From: John McCall Date: Fri, 20 Aug 2010 00:17:19 +0000 (+0000) Subject: Mangle explicit template arguments in dependent or overloaded names. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6dbce19fdae4cfae4eb5f826284978e723a04e61;p=clang Mangle explicit template arguments in dependent or overloaded names. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111591 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index 30fd668b0c..312bc9920d 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -245,6 +245,7 @@ private: void mangleCXXCtorType(CXXCtorType T); void mangleCXXDtorType(CXXDtorType T); + void mangleTemplateArgs(const ExplicitTemplateArgumentList &TemplateArgs); void mangleTemplateArgs(TemplateName Template, const TemplateArgument *TemplateArgs, unsigned NumTemplateArgs); @@ -1676,6 +1677,8 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) { mangleMemberExpr(ME->getBase(), ME->isArrow(), ME->getQualifier(), ME->getMemberName(), Arity); + if (ME->hasExplicitTemplateArgs()) + mangleTemplateArgs(ME->getExplicitTemplateArgs()); break; } @@ -1685,6 +1688,8 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) { mangleMemberExpr(ME->getBase(), ME->isArrow(), ME->getQualifier(), ME->getMember(), Arity); + if (ME->hasExplicitTemplateArgs()) + mangleTemplateArgs(ME->getExplicitTemplateArgs()); break; } @@ -1694,6 +1699,8 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) { // expression. const UnresolvedLookupExpr *ULE = cast(E); mangleUnresolvedName(ULE->getQualifier(), ULE->getName(), Arity); + if (ULE->hasExplicitTemplateArgs()) + mangleTemplateArgs(ULE->getExplicitTemplateArgs()); break; } @@ -1888,10 +1895,13 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) { } assert(QTy && "Qualifier was not type!"); - // ::= sr # dependent name + // ::= sr # dependent name + // ::= sr # dependent template-id Out << "sr"; mangleType(QualType(QTy, 0)); mangleUnqualifiedName(0, DRE->getDeclName(), Arity); + if (DRE->hasExplicitTemplateArgs()) + mangleTemplateArgs(DRE->getExplicitTemplateArgs()); break; } @@ -2020,6 +2030,15 @@ void CXXNameMangler::mangleCXXDtorType(CXXDtorType T) { } } +void CXXNameMangler::mangleTemplateArgs( + const ExplicitTemplateArgumentList &TemplateArgs) { + // ::= I + E + Out << 'I'; + for (unsigned I = 0, E = TemplateArgs.NumTemplateArgs; I != E; ++I) + mangleTemplateArg(0, TemplateArgs.getTemplateArgs()[I].getArgument()); + Out << 'E'; +} + void CXXNameMangler::mangleTemplateArgs(TemplateName Template, const TemplateArgument *TemplateArgs, unsigned NumTemplateArgs) { diff --git a/test/CodeGenCXX/mangle.cpp b/test/CodeGenCXX/mangle.cpp index c7a6e0096b..55357c7d63 100644 --- a/test/CodeGenCXX/mangle.cpp +++ b/test/CodeGenCXX/mangle.cpp @@ -551,10 +551,10 @@ namespace test17 { template A func(void); - // CHECK: define i32 @_ZN6test174testEv() + // CHECK: define void @_ZN6test174testEv() // CHECK: call {{.*}} @_ZN6test174funcINS_1BEEENS_1AIXszclsrT_3fooEEEEv() - int test() { - func(); // { dg-error "sorry, unimplemented" } + void test() { + func(); } } @@ -585,3 +585,42 @@ namespace test18 { // CHECK: define weak_odr void @_ZN6test181fINS_1AEEEvNS_1SIXadsrT_mlEEE // CHECK: define weak_odr void @_ZN6test181fINS_1AEEEvNS_1SIXadsrT_anEEE } + +// rdar://problem/8332117 +namespace test19 { + struct A { + template int f(); + int operator+(); + operator int(); + template int operator-(); + }; + + template struct S {}; + + template void g (S<&T::template f >) {} + template void g (S<&T::operator+ >) {} + template void g (S<&T::operator int>) {} + template void g (S<&T::template operator- >) {} + + // CHECK: define weak_odr void @_ZN6test191gINS_1AEEEvNS_1SIXadsrT_1fIiEEEE( + template void g(S<&A::f >); + // CHECK: define weak_odr void @_ZN6test191gINS_1AEEEvNS_1SIXadsrT_plEEE( + template void g(S<&A::operator+>); + // CHECK: define weak_odr void @_ZN6test191gINS_1AEEEvNS_1SIXadsrT_cviEEE( + template void g(S<&A::operator int>); + // CHECK: define weak_odr void @_ZN6test191gINS_1AEEEvNS_1SIXadsrT_miIdEEEE( + template void g(S<&A::operator- >); +} + +namespace test20 { + template T *f(const T&); + template T *f(T*); + + // CHECK: define weak_odr void @_ZN6test205test0IiEEvDTcl1fIPT_ELi0EEE( + template void test0(decltype(f(0))) {} + template void test0(decltype(f(0))); + + // CHECK: define weak_odr void @_ZN6test205test1IiEEvDTcl1fIEcvT__EEE( + template void test1(decltype(f<>(T()))) {} + template void test1(decltype(f<>(int()))); +}