]> granicus.if.org Git - clang/commitdiff
Remove the hack that avoided mangling static functions in extern C contexts.
authorRafael Espindola <rafael.espindola@gmail.com>
Sat, 23 Feb 2013 00:26:28 +0000 (00:26 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Sat, 23 Feb 2013 00:26:28 +0000 (00:26 +0000)
Weather we should give C language linkage to functions and variables with
internal linkage probably depends on how much code assumes it. The standard
says they should have no language linkage, but gcc and msvc assign them
C language linkage.

This commit removes the hack that was preventing the mangling on static
functions declare in extern C contexts. It is an experiment to see if we
can implement the rules in the standard.

If it turns out that many users depend on these functions and variables
having C language linkage, we should change isExternC instead and try
to convince the CWG to change the standard.

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

lib/AST/ItaniumMangle.cpp
lib/Sema/SemaOverload.cpp
test/CodeGenCXX/c-linkage.cpp
test/SemaCXX/linkage2.cpp

index d427b082a43221f99da98faa66070295a2f7f067..21c499317f5eb773986521ec73ec9221acb0b697 100644 (file)
@@ -385,15 +385,6 @@ bool ItaniumMangleContext::shouldMangleDeclName(const NamedDecl *D) {
     // C functions are not mangled.
     if (L == CLanguageLinkage)
       return false;
-
-    // FIXME: Users assume they know the mangling of static functions
-    // declared in extern "C" contexts, so we cannot always mangle them.
-    // As an improvement, maybe we could mangle them only if they are actually
-    // overloaded.
-    const DeclContext *DC = FD->getDeclContext();
-    if (!DC->isRecord() &&
-        FD->getFirstDeclaration()->getDeclContext()->isExternCContext())
-      return false;
   }
 
   // Otherwise, no mangling is done outside C++ mode.
index 20fb7a768be944184817f60f31b35b80deafc966..9bba5f6c78d9461062c9f0afb0cf8897086079ae 100644 (file)
@@ -974,14 +974,6 @@ static bool canBeOverloaded(const FunctionDecl &D) {
   if (D.isMain())
     return false;
 
-  // FIXME: Users assume they know the mangling of static functions
-  // declared in extern "C" contexts. For now just disallow overloading these
-  // functions so that we can avoid mangling them.
-  const DeclContext *DC = D.getDeclContext();
-  if (!DC->isRecord() &&
-      D.getFirstDeclaration()->getDeclContext()->isExternCContext())
-    return false;
-
   return true;
 }
 
index cec9e282f69df861ab3134196b147b3bda66023d..f6e64d9e74154a031c34d38d9655d8f72d76ee97 100644 (file)
@@ -15,11 +15,13 @@ extern "C" {
 extern "C" {
   static void test2_f() {
   }
-  // This is not required by the standard, but users assume they know
-  // the mangling of static functions in extern "C" contexts.
-  // CHECK: define internal void @test2_f(
+  // CHECK: define internal void @_Z7test2_fv
+  static void test2_f(int x) {
+  }
+  // CHECK: define internal void @_Z7test2_fi
   void test2_use() {
     test2_f();
+    test2_f(42);
   }
 }
 
index 744741b7ca69901e60e3a2dce6fa487971018b0d..2cee581b49c1c57dc4721afac237437d0c7eb5d7 100644 (file)
@@ -12,12 +12,12 @@ namespace test1 {
   }
 }
 
-// FIXME: This should be OK. Both test2_f don't have language linkage since they
-// have internal linkage.
+// This is OK. Both test2_f don't have language linkage since they have
+// internal linkage.
 extern "C" {
-  static void test2_f() { // expected-note {{previous definition is here}}
+  static void test2_f() {
   }
-  static void test2_f(int x) { // expected-error {{conflicting types for 'test2_f'}}
+  static void test2_f(int x) {
   }
 }