From 1859b1d015dc82603e004e77c599134e4d62fea5 Mon Sep 17 00:00:00 2001 From: flovent Date: Tue, 7 Oct 2025 10:33:32 +0800 Subject: [PATCH] [clang-tidy] Fix false positives about `CompoundAssignOperator` in `readability-implicit-bool-conversion` --- .../readability/ImplicitBoolConversionCheck.cpp | 3 ++- clang-tools-extra/docs/ReleaseNotes.rst | 5 +++++ .../checkers/readability/implicit-bool-conversion.cpp | 10 ++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp index 3fb856097a7e9..bfdf9cbd92d2b 100644 --- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp @@ -89,7 +89,8 @@ static void fixGenericExprCastToBool(DiagnosticBuilder &Diag, const Expr *SubExpr = Cast->getSubExpr(); - bool NeedInnerParens = utils::fixit::areParensNeededForStatement(*SubExpr); + bool NeedInnerParens = + utils::fixit::areParensNeededForStatement(*SubExpr->IgnoreImpCasts()); bool NeedOuterParens = Parent != nullptr && utils::fixit::areParensNeededForStatement(*Parent); diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 7e836a7114d50..ab73456782faa 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -381,6 +381,11 @@ Changes in existing checks declarations and macros in system headers. The documentation is also improved to differentiate the general options from the specific ones. +- Improved :doc:`readability-implicit-bool-conversion + ` check by correctly + adding parentheses when the inner expression are implicitly converted + multiple times. + - Improved :doc:`readability-qualified-auto ` check by adding the option `IgnoreAliasing`, that allows not looking at underlying types of type aliases. diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp index f3e8bf044b31b..a0e1fd309768c 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp @@ -547,3 +547,13 @@ namespace PR71848 { // CHECK-FIXES: return static_cast( foo ); } } + +namespace PR161318 { + int AddParenOutsideOfCompoundAssignOp() { + int val = -1; + while(val >>= 7) { + // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: implicit conversion 'int' -> 'bool' [readability-implicit-bool-conversion] + // CHECK-FIXES: while((val >>= 7) != 0) { + } + } +}