diff options
| author | Angel Garcia Gomez <angelgarcia@google.com> | 2015-10-16 16:15:27 +0000 |
|---|---|---|
| committer | Angel Garcia Gomez <angelgarcia@google.com> | 2015-10-16 16:15:27 +0000 |
| commit | 2918904673aefb8d2cefc4ddefaa86e90cf817e5 (patch) | |
| tree | 5e59aff25b4c49b37d71a5c5a3d3bb893b18c071 | |
| parent | 434d4599d4877d6efb3cb5965ecbb210de48f206 (diff) | |
| download | bcm5719-llvm-2918904673aefb8d2cefc4ddefaa86e90cf817e5.tar.gz bcm5719-llvm-2918904673aefb8d2cefc4ddefaa86e90cf817e5.zip | |
Replacements in different files do not overlap.
Summary: Prevent clang-tidy from discarding fixes that are in different files but happen to have the same file offset.
Reviewers: klimek, bkramer
Subscribers: bkramer, alexfh, cfe-commits
Differential Revision: http://reviews.llvm.org/D13810
llvm-svn: 250523
3 files changed, 41 insertions, 16 deletions
diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp index ed22830f886..a42efe83227 100644 --- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp +++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp @@ -469,34 +469,40 @@ void ClangTidyDiagnosticConsumer::removeIncompatibleErrors( } // Build events from error intervals. - std::vector<Event> Events; + std::map<std::string, std::vector<Event>> FileEvents; for (unsigned I = 0; I < Errors.size(); ++I) { for (const auto &Replace : Errors[I].Fix) { unsigned Begin = Replace.getOffset(); unsigned End = Begin + Replace.getLength(); + const std::string &FilePath = Replace.getFilePath(); // FIXME: Handle empty intervals, such as those from insertions. if (Begin == End) continue; - Events.push_back(Event(Begin, End, Event::ET_Begin, I, Sizes[I])); - Events.push_back(Event(Begin, End, Event::ET_End, I, Sizes[I])); + FileEvents[FilePath].push_back( + Event(Begin, End, Event::ET_Begin, I, Sizes[I])); + FileEvents[FilePath].push_back( + Event(Begin, End, Event::ET_End, I, Sizes[I])); } } - std::sort(Events.begin(), Events.end()); - // Sweep. std::vector<bool> Apply(Errors.size(), true); - int OpenIntervals = 0; - for (const auto &Event : Events) { - if (Event.Type == Event::ET_End) - --OpenIntervals; - // This has to be checked after removing the interval from the count if it - // is an end event, or before adding it if it is a begin event. - if (OpenIntervals != 0) - Apply[Event.ErrorId] = false; - if (Event.Type == Event::ET_Begin) - ++OpenIntervals; + for (auto &FileAndEvents : FileEvents) { + std::vector<Event> &Events = FileAndEvents.second; + // Sweep. + std::sort(Events.begin(), Events.end()); + int OpenIntervals = 0; + for (const auto &Event : Events) { + if (Event.Type == Event::ET_End) + --OpenIntervals; + // This has to be checked after removing the interval from the count if it + // is an end event, or before adding it if it is a begin event. + if (OpenIntervals != 0) + Apply[Event.ErrorId] = false; + if (Event.Type == Event::ET_Begin) + ++OpenIntervals; + } + assert(OpenIntervals == 0 && "Amount of begin/end points doesn't match"); } - assert(OpenIntervals == 0 && "Amount of begin/end points doesn't match"); for (unsigned I = 0; I < Errors.size(); ++I) { if (!Apply[I]) { diff --git a/clang-tools-extra/test/clang-tidy/Inputs/overlapping/o.h b/clang-tools-extra/test/clang-tidy/Inputs/overlapping/o.h new file mode 100644 index 00000000000..bfa7a0a9b39 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/Inputs/overlapping/o.h @@ -0,0 +1,9 @@ +// run: clang-tidy -checks=-*,llvm-include-order -header-filter=.* %s \ +// run: -- -isystem %S/Inputs/Headers -I %S/Inputs/overlapping | \ +// run: not grep "note: this fix will not be applied because it overlaps with another fix" + +#include "b.h" +#include "a.h" + +// The comments above are there to match the offset of the #include with the +// offset of the #includes in the .cpp file. diff --git a/clang-tools-extra/test/clang-tidy/overlapping.cpp b/clang-tools-extra/test/clang-tidy/overlapping.cpp new file mode 100644 index 00000000000..f970a136892 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/overlapping.cpp @@ -0,0 +1,10 @@ +// RUN: clang-tidy -checks=-*,llvm-include-order -header-filter=.* %s \ +// RUN: -- -isystem %S/Inputs/Headers -I %S/Inputs/overlapping | \ +// RUN: not grep "note: this fix will not be applied because it overlaps with another fix" + +#include <s.h> +#include "o.h" + +// Test that clang-tidy takes into account in which file we are doing the +// replacements to determine if they overlap or not. In the file "o.h" there is +// a similar error at the same file offset, but they do not overlap. |

