mirror of https://github.com/microsoft/clang.git
Make the mangled name collision diagnostic a bit more useful by listing the mangling.
This helps especially when the collision is for a template specialization, where the template arguments are not available from anywhere else in the diagnostic, and are likely relevant to the problem. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@333489 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2364311344
commit
0795e676aa
|
@ -2820,7 +2820,7 @@ def warn_alias_with_section : Warning<
|
|||
"%select{alias|ifunc}1 will not be in section '%0' but in the same section as the %select{aliasee|resolver}2">,
|
||||
InGroup<IgnoredAttributes>;
|
||||
def err_duplicate_mangled_name : Error<
|
||||
"definition with same mangled name as another definition">;
|
||||
"definition with same mangled name '%0' as another definition">;
|
||||
def err_cyclic_alias : Error<
|
||||
"%select{alias|ifunc}0 definition is part of a cycle">;
|
||||
def err_ifunc_resolver_return : Error<
|
||||
|
|
|
@ -2445,8 +2445,8 @@ llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
|
|||
(GD.getCanonicalDecl().getDecl() !=
|
||||
OtherGD.getCanonicalDecl().getDecl()) &&
|
||||
DiagnosedConflictingDefinitions.insert(GD).second) {
|
||||
getDiags().Report(D->getLocation(),
|
||||
diag::err_duplicate_mangled_name);
|
||||
getDiags().Report(D->getLocation(), diag::err_duplicate_mangled_name)
|
||||
<< MangledName;
|
||||
getDiags().Report(OtherGD.getDecl()->getLocation(),
|
||||
diag::note_previous_definition);
|
||||
}
|
||||
|
@ -2744,8 +2744,8 @@ CodeGenModule::GetOrCreateLLVMGlobal(StringRef MangledName,
|
|||
(OtherD = dyn_cast<VarDecl>(OtherGD.getDecl())) &&
|
||||
OtherD->hasInit() &&
|
||||
DiagnosedConflictingDefinitions.insert(D).second) {
|
||||
getDiags().Report(D->getLocation(),
|
||||
diag::err_duplicate_mangled_name);
|
||||
getDiags().Report(D->getLocation(), diag::err_duplicate_mangled_name)
|
||||
<< MangledName;
|
||||
getDiags().Report(OtherGD.getDecl()->getLocation(),
|
||||
diag::note_previous_definition);
|
||||
}
|
||||
|
@ -3783,7 +3783,8 @@ void CodeGenModule::emitIFuncDefinition(GlobalDecl GD) {
|
|||
GlobalDecl OtherGD;
|
||||
if (lookupRepresentativeDecl(MangledName, OtherGD) &&
|
||||
DiagnosedConflictingDefinitions.insert(GD).second) {
|
||||
Diags.Report(D->getLocation(), diag::err_duplicate_mangled_name);
|
||||
Diags.Report(D->getLocation(), diag::err_duplicate_mangled_name)
|
||||
<< MangledName;
|
||||
Diags.Report(OtherGD.getDecl()->getLocation(),
|
||||
diag::note_previous_definition);
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ class MyClass {
|
|||
};
|
||||
void MyClass::meth() { } // expected-note {{previous}}
|
||||
extern "C" {
|
||||
void _ZN7MyClass4methEv() { } // expected-error {{definition with same mangled name as another definition}}
|
||||
void _ZN7MyClass4methEv() { } // expected-error {{definition with same mangled name '_ZN7MyClass4methEv' as another definition}}
|
||||
}
|
||||
|
||||
#elif TEST2
|
||||
|
@ -49,7 +49,7 @@ float foo() {
|
|||
extern "C" void _ZN2T2D2Ev() {}; // expected-note {{previous definition is here}}
|
||||
|
||||
struct T2 {
|
||||
~T2() {} // expected-error {{definition with same mangled name as another definition}}
|
||||
~T2() {} // expected-error {{definition with same mangled name '_ZN2T2D2Ev' as another definition}}
|
||||
};
|
||||
|
||||
void foo() {
|
||||
|
@ -64,7 +64,7 @@ extern "C" {
|
|||
}
|
||||
|
||||
namespace nm {
|
||||
float abc = 2; // expected-error {{definition with same mangled name as another definition}}
|
||||
float abc = 2; // expected-error {{definition with same mangled name '_ZN2nm3abcE' as another definition}}
|
||||
}
|
||||
|
||||
float foo() {
|
||||
|
|
|
@ -36,7 +36,7 @@ void f1a() __asm("f1");
|
|||
void f1a() {}
|
||||
//expected-note@-1 {{previous definition is here}}
|
||||
void f1() __attribute__((ifunc("f1_ifunc")));
|
||||
//expected-error@-1 {{definition with same mangled name as another definition}}
|
||||
//expected-error@-1 {{definition with same mangled name 'f1' as another definition}}
|
||||
void* f1_ifunc() { return 0; }
|
||||
|
||||
void* f6_ifunc(int i);
|
||||
|
|
Loading…
Reference in New Issue