From: John McCall Date: Sun, 24 Apr 2011 08:43:07 +0000 (+0000) Subject: GCC seems to create address-of expression manglings when passing *any* X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c0a455942453a37dd7db83eb354f40a49872ab06;p=clang GCC seems to create address-of expression manglings when passing *any* function as a template argument where a pointer to function is wanted. Just extend the existing hack. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130084 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp index 57e955de86..a32b0ef751 100644 --- a/lib/AST/ItaniumMangle.cpp +++ b/lib/AST/ItaniumMangle.cpp @@ -2458,8 +2458,7 @@ void CXXNameMangler::mangleTemplateArg(const NamedDecl *P, // an expression. We compensate for it here to produce the correct mangling. NamedDecl *D = cast(A.getAsDecl()); const NonTypeTemplateParmDecl *Parameter = cast(P); - bool compensateMangling = D->isCXXClassMember() && - !Parameter->getType()->isReferenceType(); + bool compensateMangling = !Parameter->getType()->isReferenceType(); if (compensateMangling) { Out << 'X'; mangleOperatorName(OO_Amp, 1); diff --git a/test/CodeGenCXX/mangle.cpp b/test/CodeGenCXX/mangle.cpp index 2e1229c2cc..05cc5587e1 100644 --- a/test/CodeGenCXX/mangle.cpp +++ b/test/CodeGenCXX/mangle.cpp @@ -664,3 +664,15 @@ namespace test24 { foo(); } } + +// rdar://problem/8806641 +namespace test25 { + template struct A { + static void call() { fn(); } + }; + void foo(); + void test() { + // CHECK: call void @_ZN6test251AIXadL_ZNS_3fooEvEEE4callEv() + A::call(); + } +}