aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/AST/ItaniumMangle.cpp9
-rw-r--r--lib/Sema/SemaOverload.cpp8
-rw-r--r--test/CodeGenCXX/c-linkage.cpp8
-rw-r--r--test/SemaCXX/linkage2.cpp8
4 files changed, 9 insertions, 24 deletions
diff --git a/lib/AST/ItaniumMangle.cpp b/lib/AST/ItaniumMangle.cpp
index d427b082a4..21c499317f 100644
--- a/lib/AST/ItaniumMangle.cpp
+++ b/lib/AST/ItaniumMangle.cpp
@@ -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.
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp
index 20fb7a768b..9bba5f6c78 100644
--- a/lib/Sema/SemaOverload.cpp
+++ b/lib/Sema/SemaOverload.cpp
@@ -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;
}
diff --git a/test/CodeGenCXX/c-linkage.cpp b/test/CodeGenCXX/c-linkage.cpp
index cec9e282f6..f6e64d9e74 100644
--- a/test/CodeGenCXX/c-linkage.cpp
+++ b/test/CodeGenCXX/c-linkage.cpp
@@ -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);
}
}
diff --git a/test/SemaCXX/linkage2.cpp b/test/SemaCXX/linkage2.cpp
index 744741b7ca..2cee581b49 100644
--- a/test/SemaCXX/linkage2.cpp
+++ b/test/SemaCXX/linkage2.cpp
@@ -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) {
}
}