<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>