summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAngel Garcia Gomez <angelgarcia@google.com>2015-10-16 16:15:27 +0000
committerAngel Garcia Gomez <angelgarcia@google.com>2015-10-16 16:15:27 +0000
commit2918904673aefb8d2cefc4ddefaa86e90cf817e5 (patch)
tree5e59aff25b4c49b37d71a5c5a3d3bb893b18c071
parent434d4599d4877d6efb3cb5965ecbb210de48f206 (diff)
downloadbcm5719-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
-rw-r--r--clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp38
-rw-r--r--clang-tools-extra/test/clang-tidy/Inputs/overlapping/o.h9
-rw-r--r--clang-tools-extra/test/clang-tidy/overlapping.cpp10
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.
OpenPOWER on IntegriCloud