summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorRichard Trieu <rtrieu@google.com>2017-06-21 01:43:13 +0000
committerRichard Trieu <rtrieu@google.com>2017-06-21 01:43:13 +0000
commitca48d369bac37ee9f2d4b44c50303fb0b1e73b44 (patch)
treedb7ef9b8420f3bbf8e28ab0be3b6a663db2676b9 /clang
parentff7b8ea2a06fd0ff40d9df03ff9e58cb8d38aa38 (diff)
downloadbcm5719-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.td5
-rw-r--r--clang/lib/Serialization/ASTReader.cpp11
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;
}
OpenPOWER on IntegriCloud