From 149239651d33b2787246097daf2326351a85ba77 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Thu, 3 Feb 2011 23:41:12 +0000 Subject: [PATCH] If any Fix-Its attached to a diagnostic have invalid source locations or source locations that refer into a macro instantiation, delete all of the Fix-Its on that diagnostic. llvm-svn: 124833 --- clang/lib/Basic/DiagnosticIDs.cpp | 13 +++++++++++++ clang/test/Index/fix-its.c | 18 ++++++++++++++++++ clang/tools/c-index-test/c-index-test.c | 2 +- 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 clang/test/Index/fix-its.c diff --git a/clang/lib/Basic/DiagnosticIDs.cpp b/clang/lib/Basic/DiagnosticIDs.cpp index 8efeb6897d0f..8725e7f9c0cc 100644 --- a/clang/lib/Basic/DiagnosticIDs.cpp +++ b/clang/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/clang/test/Index/fix-its.c b/clang/test/Index/fix-its.c new file mode 100644 index 000000000000..d82f2998e6fd --- /dev/null +++ b/clang/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/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c index 8c87d3765194..d4e567d9e26a 100644 --- a/clang/tools/c-index-test/c-index-test.c +++ b/clang/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);