]> granicus.if.org Git - clang/commitdiff
Itanium ABI: Properly mangle extern "C" template arguments
authorDavid Majnemer <david.majnemer@gmail.com>
Wed, 18 Feb 2015 19:08:11 +0000 (19:08 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Wed, 18 Feb 2015 19:08:11 +0000 (19:08 +0000)
extern "C" declarations should be considered like global declarations
for mangling purposes.

Differential Revision: http://reviews.llvm.org/D7718

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@229724 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ItaniumMangle.cpp
test/CodeGenCXX/mangle-template.cpp

index f56e242d374a85c2b49aaeceab007b596bd006ed..b97a2e6d5718d02bcf0e3a8b5d26a726ede1028a 100644 (file)
@@ -69,6 +69,14 @@ static const DeclContext *getEffectiveDeclContext(const Decl *D) {
   if (const CapturedDecl *CD = dyn_cast<CapturedDecl>(DC))
     return getEffectiveDeclContext(CD);
 
+  if (const auto *VD = dyn_cast<VarDecl>(D))
+    if (VD->isExternC())
+      return VD->getASTContext().getTranslationUnitDecl();
+
+  if (const auto *FD = dyn_cast<FunctionDecl>(D))
+    if (FD->isExternC())
+      return FD->getASTContext().getTranslationUnitDecl();
+
   return DC;
 }
 
index 28db27173ec4fbc5dbada7e5f0ec354e4c037339..25231c2b035d840beb9a4e74d31e1d002dd4158d 100644 (file)
@@ -29,8 +29,7 @@ namespace test3 {
 // CHECK: void @test3_f0
 extern "C" void test3_f0(float) {}
 template<void (&)(float)> struct t1 {};
-// FIXME: Fails because we tack on a namespace.
-// CHECK-FIXME: void @_ZN5test32f1ENS_2t1ILZ8test3_f0EEE(
+// CHECK: void @_ZN5test32f1ENS_2t1IL_Z8test3_f0EEE(
 void f1(t1<test3_f0> a0) {}
 }
 
@@ -38,8 +37,7 @@ namespace test4 {
 // CHECK: void @test4_f0
 extern "C" void test4_f0(float) {}
 template<void (*)(float)> struct t1 {};
-// FIXME: Fails because we don't treat as an expression.
-// CHECK-FIXME: void @_ZN5test42f1ENS_2t1IXadL_Z8test4_f0EEEE(
+// CHECK: void @_ZN5test42f1ENS_2t1IXadL_Z8test4_f0EEEE(
 void f1(t1<test4_f0> a0) {}
 }