diff --git a/clang-tools-extra/clang-tidy/ClangTidy.cpp b/clang-tools-extra/clang-tidy/ClangTidy.cpp index 4ae2864d310d0..8f5728dea8c2a 100644 --- a/clang-tools-extra/clang-tidy/ClangTidy.cpp +++ b/clang-tools-extra/clang-tidy/ClangTidy.cpp @@ -540,7 +540,7 @@ runClangTidy(clang::tidy::ClangTidyContext &Context, ArrayRef InputFiles, llvm::IntrusiveRefCntPtr BaseFS, bool ApplyAnyFix, bool EnableCheckProfile, - llvm::StringRef StoreCheckProfile) { + llvm::StringRef StoreCheckProfile, bool Quiet) { ClangTool Tool(Compilations, InputFiles, std::make_shared(), BaseFS); @@ -577,8 +577,9 @@ runClangTidy(clang::tidy::ClangTidyContext &Context, class ActionFactory : public FrontendActionFactory { public: ActionFactory(ClangTidyContext &Context, - IntrusiveRefCntPtr BaseFS) - : ConsumerFactory(Context, std::move(BaseFS)) {} + IntrusiveRefCntPtr BaseFS, + bool Quiet) + : ConsumerFactory(Context, std::move(BaseFS)), Quiet(Quiet) {} std::unique_ptr create() override { return std::make_unique(&ConsumerFactory); } @@ -589,6 +590,8 @@ runClangTidy(clang::tidy::ClangTidyContext &Context, DiagnosticConsumer *DiagConsumer) override { // Explicitly ask to define __clang_analyzer__ macro. Invocation->getPreprocessorOpts().SetUpStaticAnalyzer = true; + if (Quiet) + Invocation->getDiagnosticOpts().ShowCarets = false; return FrontendActionFactory::runInvocation( Invocation, Files, PCHContainerOps, DiagConsumer); } @@ -607,9 +610,10 @@ runClangTidy(clang::tidy::ClangTidyContext &Context, }; ClangTidyASTConsumerFactory ConsumerFactory; + bool Quiet; }; - ActionFactory Factory(Context, std::move(BaseFS)); + ActionFactory Factory(Context, std::move(BaseFS), Quiet); Tool.run(&Factory); return DiagConsumer.take(); } diff --git a/clang-tools-extra/clang-tidy/ClangTidy.h b/clang-tools-extra/clang-tidy/ClangTidy.h index 454261bbd6840..d37d68ec0a5b9 100644 --- a/clang-tools-extra/clang-tidy/ClangTidy.h +++ b/clang-tools-extra/clang-tidy/ClangTidy.h @@ -94,7 +94,8 @@ runClangTidy(clang::tidy::ClangTidyContext &Context, ArrayRef InputFiles, llvm::IntrusiveRefCntPtr BaseFS, bool ApplyAnyFix, bool EnableCheckProfile = false, - llvm::StringRef StoreCheckProfile = StringRef()); + llvm::StringRef StoreCheckProfile = StringRef(), + bool Quiet = false); /// Controls what kind of fixes clang-tidy is allowed to apply. enum FixBehaviour { diff --git a/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp b/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp index df3a8b22b1e24..bef3b938b5afd 100644 --- a/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp +++ b/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp @@ -717,7 +717,7 @@ int clangTidyMain(int argc, const char **argv) { EnableModuleHeadersParsing); std::vector Errors = runClangTidy(Context, OptionsParser->getCompilations(), PathList, BaseFS, - FixNotes, EnableCheckProfile, ProfilePrefix); + FixNotes, EnableCheckProfile, ProfilePrefix, Quiet); bool FoundErrors = llvm::any_of(Errors, [](const ClangTidyError &E) { return E.DiagLevel == ClangTidyError::Error; }); diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index b481c56c262c4..8a6d7d12bd65e 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -112,6 +112,9 @@ Improvements to clang-tidy - Improved documentation of the `-line-filter` command-line flag of :program:`clang-tidy` and :program:`run-clang-tidy.py`. +- Improved :program:`clang-tidy` option `-quiet` by suppressing diagnostic + count messages. + New checks ^^^^^^^^^^ diff --git a/clang-tools-extra/test/clang-tidy/infrastructure/file-filter-symlinks.cpp b/clang-tools-extra/test/clang-tidy/infrastructure/file-filter-symlinks.cpp index 7efa7d070f69f..58f3b23cb1dbf 100644 --- a/clang-tools-extra/test/clang-tidy/infrastructure/file-filter-symlinks.cpp +++ b/clang-tools-extra/test/clang-tidy/infrastructure/file-filter-symlinks.cpp @@ -10,7 +10,7 @@ // RUN: clang-tidy -checks='-*,google-explicit-constructor' -header-filter='header_alias\.h' %s -- -I %t 2>&1 | FileCheck --check-prefix=CHECK_HEADER_ALIAS %s // RUN: clang-tidy -checks='-*,google-explicit-constructor' -header-filter='header_alias\.h' -quiet %s -- -I %t 2>&1 | FileCheck --check-prefix=CHECK_HEADER_ALIAS %s // RUN: clang-tidy -checks='-*,google-explicit-constructor' -header-filter='header\.h' %s -- -I %t 2>&1 | FileCheck --check-prefix=CHECK_HEADER %s -// RUN: clang-tidy -checks='-*,google-explicit-constructor' -header-filter='header\.h' -quiet %s -- -I %t 2>&1 | FileCheck --check-prefix=CHECK_HEADER %s +// RUN: clang-tidy -checks='-*,google-explicit-constructor' -header-filter='header\.h' -quiet %s -- -I %t 2>&1 | FileCheck --check-prefix=CHECK_HEADER --allow-empty %s // Check that `-header-filter` operates on the same file paths as paths in // diagnostics printed by ClangTidy. diff --git a/clang-tools-extra/test/clang-tidy/infrastructure/quiet-flag.cpp b/clang-tools-extra/test/clang-tidy/infrastructure/quiet-flag.cpp new file mode 100644 index 0000000000000..0ed6d017a934f --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/infrastructure/quiet-flag.cpp @@ -0,0 +1,26 @@ +// This test ensures that the --quiet flag only suppresses the "X warnings generated" +// message while keeping all diagnostic information including caret indicators (^). + +// RUN: clang-tidy -checks=-*,readability-magic-numbers,clang-diagnostic-sign-compare %s -- \ +// RUN: -Wsign-compare 2>&1 | FileCheck %s --check-prefix=CHECK-NORMAL +// RUN: clang-tidy -checks=-*,readability-magic-numbers,clang-diagnostic-sign-compare -quiet %s -- \ +// RUN: -Wsign-compare 2>&1 | FileCheck %s --check-prefix=CHECK-QUIET + +// CHECK-NORMAL: 2 warnings generated +// CHECK-NORMAL-DAG: warning: 42 is a magic number +// CHECK-NORMAL-DAG: {{[ ]*\^}} +// CHECK-NORMAL-DAG: warning: comparison of integers of different signs +// CHECK-NORMAL-DAG: {{[ ]*~ \^ ~}} + +// CHECK-QUIET-NOT: {{[0-9]+}} warning{{s?}} generated +// CHECK-QUIET-DAG: warning: 42 is a magic number +// CHECK-QUIET-DAG: {{[ ]*\^}} +// CHECK-QUIET-DAG: warning: comparison of integers of different signs +// CHECK-QUIET-DAG: {{[ ]*~ \^ ~}} + +int main() { + const int CONST_VAL = 10; + int x = 42; // trigger 'readability-magic-numbers' with caret: ^ + unsigned int y = CONST_VAL; + return x < y; // trigger 'clang-diagnostic-sign-compare' with caret: ^ +}