aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Basic/DiagnosticIDs.cpp13
-rw-r--r--test/Index/fix-its.c18
-rw-r--r--tools/c-index-test/c-index-test.c2
3 files changed, 32 insertions, 1 deletions
diff --git a/lib/Basic/DiagnosticIDs.cpp b/lib/Basic/DiagnosticIDs.cpp
index 8efeb6897d..8725e7f9c0 100644
--- a/lib/Basic/DiagnosticIDs.cpp
+++ b/lib/Basic/DiagnosticIDs.cpp
@@ -560,6 +560,19 @@ bool DiagnosticIDs::ProcessDiag(Diagnostic &Diag) const {
Diag.SetDelayedDiagnostic(diag::fatal_too_many_errors);
}
+ // If we have any Fix-Its, make sure that all of the Fix-Its point into
+ // source locations that aren't macro instantiations. If any point into
+ // macro instantiations, remove all of the Fix-Its.
+ for (unsigned I = 0, N = Diag.NumFixItHints; I != N; ++I) {
+ const FixItHint &FixIt = Diag.FixItHints[I];
+ if (FixIt.RemoveRange.isInvalid() ||
+ FixIt.RemoveRange.getBegin().isMacroID() ||
+ FixIt.RemoveRange.getEnd().isMacroID()) {
+ Diag.NumFixItHints = 0;
+ break;
+ }
+ }
+
// Finally, report it.
Diag.Client->HandleDiagnostic((Diagnostic::Level)DiagLevel, Info);
if (Diag.Client->IncludeInDiagnosticCounts()) {
diff --git a/test/Index/fix-its.c b/test/Index/fix-its.c
new file mode 100644
index 0000000000..d82f2998e6
--- /dev/null
+++ b/test/Index/fix-its.c
@@ -0,0 +1,18 @@
+// RUN: c-index-test -test-load-source all -fspell-checking %s 2> %t
+// RUN: FileCheck %s < %t
+struct X {
+ int wibble;
+};
+
+#define MACRO(X) X
+
+void f(struct X *x) {
+ // CHECK: error: no member named 'wobble' in 'struct X'; did you mean 'wibble'?
+ // CHECK-NOT: FIX-IT
+ // CHECK: note: 'wibble' declared here
+ MACRO(x->wobble = 17);
+ // CHECK: error: no member named 'wabble' in 'struct X'; did you mean 'wibble'?
+ // CHECK: FIX-IT: Replace [17:6 - 17:12] with "wibble"
+ // CHECK: note: 'wibble' declared here
+ x->wabble = 17;
+}
diff --git a/tools/c-index-test/c-index-test.c b/tools/c-index-test/c-index-test.c
index 8c87d37651..d4e567d9e2 100644
--- a/tools/c-index-test/c-index-test.c
+++ b/tools/c-index-test/c-index-test.c
@@ -683,7 +683,7 @@ int perform_test_load_source(int argc, const char **argv,
Idx = clang_createIndex(/* excludeDeclsFromPCH */
(!strcmp(filter, "local") ||
!strcmp(filter, "local-display"))? 1 : 0,
- /* displayDiagnosics=*/1);
+ /* displayDiagnosics=*/0);
if (parse_remapped_files(argc, argv, 0, &unsaved_files, &num_unsaved_files)) {
clang_disposeIndex(Idx);