summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp7
-rw-r--r--clang-tools-extra/unittests/clang-tidy/CMakeLists.txt1
-rw-r--r--clang-tools-extra/unittests/clang-tidy/ClangTidyDiagnosticConsumerTest.cpp33
-rw-r--r--clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h10
4 files changed, 46 insertions, 5 deletions
diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
index 0d1180dacbe..44d35d97475 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
@@ -239,10 +239,11 @@ void ClangTidyDiagnosticConsumer::finish() {
finalizeLastError();
std::set<const ClangTidyError*, LessClangTidyError> UniqueErrors;
for (const ClangTidyError &Error : Errors) {
- if (Context.getChecksFilter().isCheckEnabled(Error.CheckName) &&
- UniqueErrors.insert(&Error).second)
- Context.storeError(Error);
+ if (Context.getChecksFilter().isCheckEnabled(Error.CheckName))
+ UniqueErrors.insert(&Error);
}
+ for (const ClangTidyError *Error : UniqueErrors)
+ Context.storeError(*Error);
Errors.clear();
}
diff --git a/clang-tools-extra/unittests/clang-tidy/CMakeLists.txt b/clang-tools-extra/unittests/clang-tidy/CMakeLists.txt
index 5d29b0f9e8f..fc1217d6a36 100644
--- a/clang-tools-extra/unittests/clang-tidy/CMakeLists.txt
+++ b/clang-tools-extra/unittests/clang-tidy/CMakeLists.txt
@@ -7,6 +7,7 @@ get_filename_component(CLANG_LINT_SOURCE_DIR
include_directories(${CLANG_LINT_SOURCE_DIR})
add_extra_unittest(ClangTidyTests
+ ClangTidyDiagnosticConsumerTest.cpp
LLVMModuleTest.cpp
GoogleModuleTest.cpp
MiscModuleTest.cpp)
diff --git a/clang-tools-extra/unittests/clang-tidy/ClangTidyDiagnosticConsumerTest.cpp b/clang-tools-extra/unittests/clang-tidy/ClangTidyDiagnosticConsumerTest.cpp
new file mode 100644
index 00000000000..08255a62ef9
--- /dev/null
+++ b/clang-tools-extra/unittests/clang-tidy/ClangTidyDiagnosticConsumerTest.cpp
@@ -0,0 +1,33 @@
+#include "ClangTidy.h"
+#include "ClangTidyTest.h"
+#include "gtest/gtest.h"
+
+namespace clang {
+namespace tidy {
+namespace test {
+
+class TestCheck : public ClangTidyCheck {
+public:
+ void registerMatchers(ast_matchers::MatchFinder *Finder) override {
+ Finder->addMatcher(ast_matchers::varDecl().bind("var"), this);
+ }
+ void check(const ast_matchers::MatchFinder::MatchResult &Result) override {
+ const VarDecl *Var = Result.Nodes.getNodeAs<VarDecl>("var");
+ // Add diagnostics in the wrong order.
+ diag(Var->getLocation(), "variable");
+ diag(Var->getTypeSpecStartLoc(), "type specifier");
+ }
+};
+
+TEST(ClangTidyDiagnosticConsumer, SortsErrors) {
+ SmallVector<ClangTidyError, 8> Errors;
+ runCheckOnCode<TestCheck>("int a;", Errors);
+ EXPECT_EQ(2ul, Errors.size());
+ // FIXME: Remove " []" once the check name is removed from the message text.
+ EXPECT_EQ("type specifier []", Errors[0].Message.Message);
+ EXPECT_EQ("variable []", Errors[1].Message.Message);
+}
+
+} // namespace test
+} // namespace tidy
+} // namespace clang
diff --git a/clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h b/clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h
index 06d5c720eeb..8b3d9c6a6bf 100644
--- a/clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h
+++ b/clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h
@@ -39,9 +39,10 @@ private:
ClangTidyContext *Context;
};
-template <typename T> std::string runCheckOnCode(StringRef Code) {
+template <typename T>
+std::string runCheckOnCode(StringRef Code,
+ SmallVectorImpl<ClangTidyError> &Errors) {
T Check;
- SmallVector<ClangTidyError, 16> Errors;
ClangTidyContext Context(&Errors, ".*", "");
ClangTidyDiagnosticConsumer DiagConsumer(Context);
Check.setContext(&Context);
@@ -65,6 +66,11 @@ template <typename T> std::string runCheckOnCode(StringRef Code) {
return tooling::applyAllReplacements(Code, Fixes);
}
+template <typename T> std::string runCheckOnCode(StringRef Code) {
+ SmallVector<ClangTidyError, 16> Errors;
+ return runCheckOnCode<T>(Code, Errors);
+}
+
} // namespace test
} // namespace tidy
} // namespace clang
OpenPOWER on IntegriCloud