summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/CodeGen/CodeGenModule.cpp17
-rw-r--r--clang/test/CodeGenCXX/duplicate-mangled-name2.cpp9
-rw-r--r--clang/test/CodeGenCXX/duplicate-mangled-name3.cpp10
3 files changed, 8 insertions, 28 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 4dd965f24a7..f60a68ab011 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -1372,15 +1372,6 @@ void CodeGenModule::EmitGlobal(GlobalDecl GD) {
/*DontDefer=*/false);
return;
}
-
- if (llvm::GlobalValue *GV = GetGlobalValue(getMangledName(GD)))
- if (!GV->isDeclaration()) {
- getDiags().Report(FD->getLocation(), diag::err_duplicate_mangled_name);
- GlobalDecl OldGD = Manglings.lookup(GV->getName());
- if (auto *Prev = OldGD.getDecl())
- getDiags().Report(Prev->getLocation(), diag::note_previous_definition);
- return;
- }
} else {
const auto *VD = cast<VarDecl>(Global);
assert(VD->isFileVarDecl() && "Cannot emit local var decl as global.");
@@ -2414,6 +2405,14 @@ void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD,
}
}
+ if (!GV->isDeclaration()) {
+ getDiags().Report(D->getLocation(), diag::err_duplicate_mangled_name);
+ GlobalDecl OldGD = Manglings.lookup(GV->getName());
+ if (auto *Prev = OldGD.getDecl())
+ getDiags().Report(Prev->getLocation(), diag::note_previous_definition);
+ return;
+ }
+
if (GV->getType()->getElementType() != Ty) {
// If the types mismatch then we have to rewrite the definition.
assert(GV->isDeclaration() && "Shouldn't replace non-declaration");
diff --git a/clang/test/CodeGenCXX/duplicate-mangled-name2.cpp b/clang/test/CodeGenCXX/duplicate-mangled-name2.cpp
deleted file mode 100644
index e582733fd8a..00000000000
--- a/clang/test/CodeGenCXX/duplicate-mangled-name2.cpp
+++ /dev/null
@@ -1,9 +0,0 @@
-// RUN: %clang_cc1 -triple i686-pc-linux-gnu -emit-llvm-only %s -verify
-// RUN: %clang_cc1 -triple i686-pc-linux-gnu -femit-all-decls -emit-llvm-only %s -verify
-
-void foo(void *p) __asm("_ZN1SC2Ev");
-void foo(void *p) { } // expected-note {{previous}}
-
-struct S {
- S() {} // expected-error {{definition with same mangled name as another definition}}
-} s;
diff --git a/clang/test/CodeGenCXX/duplicate-mangled-name3.cpp b/clang/test/CodeGenCXX/duplicate-mangled-name3.cpp
deleted file mode 100644
index 17dbc9bc85f..00000000000
--- a/clang/test/CodeGenCXX/duplicate-mangled-name3.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm-only %s -verify
-// RUN: %clang_cc1 -triple %itanium_abi_triple -femit-all-decls -emit-llvm-only %s -verify
-
-extern "C" {
- void _ZN1SC2Ev(void *p) { } // expected-note {{previous}}
-}
-
-struct S {
- S() {} // expected-error {{definition with same mangled name as another definition}}
-} s;
OpenPOWER on IntegriCloud