diff options
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 17 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/duplicate-mangled-name2.cpp | 9 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/duplicate-mangled-name3.cpp | 10 |
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; |