]> granicus.if.org Git - clang/commitdiff
Likely fix for PR9316 and other unknown bugs: don't use the anonynmous
authorChandler Carruth <chandlerc@gmail.com>
Thu, 24 Feb 2011 19:03:39 +0000 (19:03 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Thu, 24 Feb 2011 19:03:39 +0000 (19:03 +0000)
namespace blanket rule for variables and functions declared 'extern
"C"'.

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

lib/AST/Decl.cpp
test/SemaCXX/linkage.cpp

index 18c680b1fe77d9061cbc492ad465544e4dfb3aee..b482a0329942b0d05f7d682e7f168b3710150601 100644 (file)
@@ -266,8 +266,12 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D, LVFlags F) {
       return LinkageInfo::internal();
   }
 
-  if (D->isInAnonymousNamespace())
-    return LinkageInfo::uniqueExternal();
+  if (D->isInAnonymousNamespace()) {
+    const VarDecl *Var = dyn_cast<VarDecl>(D);
+    const FunctionDecl *Func = dyn_cast<FunctionDecl>(D);
+    if ((!Var || !Var->isExternC()) && (!Func || !Func->isExternC()))
+      return LinkageInfo::uniqueExternal();
+  }
 
   // Set up the defaults.
 
index ba56318fbd68caaa691aceeebd5eacd321330e2f..b93a310b00f743ca5ebcc21705dc0497d9c98ed1 100644 (file)
@@ -64,5 +64,10 @@ namespace test3 {
   extern "C" void test3(A a) {}
 }
 
+namespace {
+  // CHECK: define void @test4(
+  extern "C" void test4(void) {}
+}
+
 // CHECK: define linkonce_odr i8* @_ZN5test21A1BILj0EE3fooEv(
 // CHECK: define linkonce_odr i8* @_ZN5test11A3fooILj0EEEPvv(