Index: clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp =================================================================== --- clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp +++ clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp @@ -742,8 +742,9 @@ const tooling::DiagnosticMessage &M1 = LHS.Message; const tooling::DiagnosticMessage &M2 = RHS.Message; - return std::tie(M1.FilePath, M1.FileOffset, M1.Message) < - std::tie(M2.FilePath, M2.FileOffset, M2.Message); + return + std::tie(M1.FilePath, M1.FileOffset, LHS.DiagnosticName, M1.Message) < + std::tie(M2.FilePath, M2.FileOffset, RHS.DiagnosticName, M2.Message); } }; struct EqualClangTidyError { Index: clang-tools-extra/test/clang-tidy/duplicate-reports.cpp =================================================================== --- /dev/null +++ clang-tools-extra/test/clang-tidy/duplicate-reports.cpp @@ -0,0 +1,15 @@ +// RUN: %check_clang_tidy %s cert-err09-cpp,cert-err61-cpp %t + +void alwaysThrows() { + int ex = 42; + // CHECK-MESSAGES: warning: throw expression should throw anonymous temporary values instead [cert-err09-cpp] + // CHECK-MESSAGES: warning: throw expression should throw anonymous temporary values instead [cert-err61-cpp] + throw ex; +} + +void doTheJob() { + try { + alwaysThrows(); + } catch (int&) { + } +}