diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-07-14 20:08:49 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-07-14 20:08:49 +0000 |
commit | 38a50c0a1620bfee536d292207100678ce7ab471 (patch) | |
tree | a89fd4ec22a767891e535863da4c4d9d59663dcc /clang/lib/Sema/SemaDecl.cpp | |
parent | f69606b117c9f141469b164f306906485dad78f1 (diff) | |
download | bcm5719-llvm-38a50c0a1620bfee536d292207100678ce7ab471.tar.gz bcm5719-llvm-38a50c0a1620bfee536d292207100678ce7ab471.zip |
[Sema] Emit a better diagnostic when variable redeclarations disagree
We referred to all declaration in definitions in our diagnostic messages
which is can be inaccurate. Instead, classify the declaration and emit
an appropriate diagnostic for the new declaration and an appropriate
note pointing to the old one.
This fixes PR24116.
llvm-svn: 242190
Diffstat (limited to 'clang/lib/Sema/SemaDecl.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 28877210c6a..5646099015b 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -3270,9 +3270,16 @@ void Sema::MergeVarDeclTypes(VarDecl *New, VarDecl *Old, // // Neither C nor C++ requires a diagnostic for this, but we should still try // to diagnose it. - Diag(New->getLocation(), diag::err_redefinition_different_type) - << New->getDeclName() << New->getType() << Old->getType(); - Diag(Old->getLocation(), diag::note_previous_definition); + Diag(New->getLocation(), New->isThisDeclarationADefinition() + ? diag::err_redefinition_different_type + : diag::err_redeclaration_different_type) + << New->getDeclName() << New->getType() << Old->getType(); + + diag::kind PrevDiag; + SourceLocation OldLocation; + std::tie(PrevDiag, OldLocation) = + getNoteDiagForInvalidRedeclaration(Old, New); + Diag(OldLocation, PrevDiag); return New->setInvalidDecl(); } |