<p dir="ltr"><br>
On Mar 6, 2014 6:16 PM, "Alexander Kornienko" <<a href="mailto:alexfh@google.com">alexfh@google.com</a>> wrote:<br>
><br>
> Hi djasper, pcc,<br>
><br>
> Peter, I guess, this can help you in testing your check.<br>
><br>
> <a href="http://llvm-reviews.chandlerc.com/D2989">http://llvm-reviews.chandlerc.com/D2989</a><br>
><br>
> Files:<br>
> clang-tidy/ClangTidyDiagnosticConsumer.cpp<br>
> test/clang-tidy/deduplication.cpp<br>
><br>
> Index: clang-tidy/ClangTidyDiagnosticConsumer.cpp<br>
> ===================================================================<br>
> --- clang-tidy/ClangTidyDiagnosticConsumer.cpp<br>
> +++ clang-tidy/ClangTidyDiagnosticConsumer.cpp<br>
> @@ -19,6 +19,8 @@<br>
> #include "ClangTidyDiagnosticConsumer.h"<br>
> #include "llvm/ADT/SmallString.h"<br>
><br>
> +#include <set><br>
> +<br>
> namespace clang {<br>
> namespace tidy {<br>
><br>
> @@ -116,11 +118,37 @@<br>
> }<br>
> }<br>
><br>
> +struct LessClangTidyError {<br>
> + bool operator()(const ClangTidyError *LHS, const ClangTidyError *RHS) const {<br>
> + const ClangTidyMessage &M1 = LHS->Message;<br>
> + const ClangTidyMessage &M2 = RHS->Message;<br>
> +<br>
> + if (M1.FileOffset < M2.FileOffset)<br>
> + return true;<br>
> + if (M1.FileOffset > M2.FileOffset)<br>
> + return false;</p>
<p dir="ltr">I'd write those as:<br>
If (a != b) <br>
Return a < b;</p>
<p dir="ltr">> + int Result = M1.FilePath.compare(M2.FilePath);<br>
> + if (Result < 0)<br>
> + return true;<br>
> + if (Result > 0)<br>
> + return false;</p>
<p dir="ltr">Same here. </p>
<p dir="ltr">> + Result = M1.Message.compare(M2.Message);<br>
> + if (Result < 0)<br>
> + return true;<br>
> + if (Result > 0)<br>
> + return false;<br>
> + return false;</p>
<p dir="ltr">Return result < 0;</p>
<p dir="ltr">> + }<br>
> +};<br>
> +<br>
> // Flushes the internal diagnostics buffer to the ClangTidyContext.<br>
> void ClangTidyDiagnosticConsumer::finish() {<br>
> finalizeLastError();<br>
> - for (const ClangTidyError &Error : Errors)<br>
> - Context.storeError(Error);<br>
> + std::set<const ClangTidyError*, LessClangTidyError> UniqueErrors;<br>
> + for (const ClangTidyError &Error : Errors) {<br>
> + if (UniqueErrors.insert(&Error).second)<br>
> + Context.storeError(Error);<br>
> + }<br>
> Errors.clear();<br>
> }<br>
><br>
> Index: test/clang-tidy/deduplication.cpp<br>
> ===================================================================<br>
> --- /dev/null<br>
> +++ test/clang-tidy/deduplication.cpp<br>
> @@ -0,0 +1,12 @@<br>
> +// RUN: clang-tidy -checks=google-explicit-constructor %s -- | FileCheck %s<br>
> +<br>
> +template<typename T><br>
> +class A { A(T); };<br>
> +// CHECK: :[[@LINE-1]]:11: warning: Single-argument constructors must be explicit [google-explicit-constructor]<br>
> +// CHECK-NOT: warning:<br>
> +<br>
> +<br>
> +void f() {<br>
> + A<int> a;<br>
> + A<double> b;<br>
> +}<br>
><br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
><br>
</p>