diff options
author | Richard Trieu <rtrieu@google.com> | 2017-06-21 01:43:13 +0000 |
---|---|---|
committer | Richard Trieu <rtrieu@google.com> | 2017-06-21 01:43:13 +0000 |
commit | ca48d369bac37ee9f2d4b44c50303fb0b1e73b44 (patch) | |
tree | db7ef9b8420f3bbf8e28ab0be3b6a663db2676b9 /clang | |
parent | ff7b8ea2a06fd0ff40d9df03ff9e58cb8d38aa38 (diff) | |
download | bcm5719-llvm-ca48d369bac37ee9f2d4b44c50303fb0b1e73b44.tar.gz bcm5719-llvm-ca48d369bac37ee9f2d4b44c50303fb0b1e73b44.zip |
[ODRHash] Supply more information when generic error message is emitted.
llvm-svn: 305872
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSerializationKinds.td | 5 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 11 |
2 files changed, 16 insertions, 0 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSerializationKinds.td b/clang/include/clang/Basic/DiagnosticSerializationKinds.td index 0a59a633232..3c64ebb9c7f 100644 --- a/clang/include/clang/Basic/DiagnosticSerializationKinds.td +++ b/clang/include/clang/Basic/DiagnosticSerializationKinds.td @@ -112,8 +112,13 @@ def note_module_odr_violation_possible_decl : Note< def err_module_odr_violation_different_definitions : Error< "%q0 has different definitions in different modules; " "%select{definition in module '%2' is here|defined here}1">; +def note_first_module_difference : Note< + "in first definition, possible difference is here">; def note_module_odr_violation_different_definitions : Note< "definition in module '%0' is here">; +def note_second_module_difference : Note< + "in second definition, possible difference is here">; + def err_module_odr_violation_different_instantiations : Error< "instantiation of %q0 is different in different modules">; diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index eeb0132c169..d033a9b32c0 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -9324,9 +9324,20 @@ void ASTReader::diagnoseOdrViolations() { diag::err_module_odr_violation_different_definitions) << FirstRecord << FirstModule.empty() << FirstModule; + if (FirstDecl) { + Diag(FirstDecl->getLocation(), diag::note_first_module_difference) + << FirstRecord << FirstDecl->getSourceRange(); + } + Diag(SecondRecord->getLocation(), diag::note_module_odr_violation_different_definitions) << SecondModule; + + if (SecondDecl) { + Diag(SecondDecl->getLocation(), diag::note_second_module_difference) + << SecondDecl->getSourceRange(); + } + Diagnosed = true; break; } |