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
This commit is contained in:
Douglas Gregor 2011-02-03 23:41:12 +00:00
parent cd25b86fb9
commit 149239651d
3 changed files with 32 additions and 1 deletions

View File

@ -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()) {

View File

@ -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;
}

View File

@ -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);