Author: Eduard Voronkin Date: 2026-03-16T16:07:00+08:00 New Revision: 513f34a62b337924051887a1c63dc57d02c48656
URL: https://github.com/llvm/llvm-project/commit/513f34a62b337924051887a1c63dc57d02c48656 DIFF: https://github.com/llvm/llvm-project/commit/513f34a62b337924051887a1c63dc57d02c48656.diff LOG: [clang-tidy] Fix an edge case in readability-implicit-bool-conversion (#186234) Fix a FP for condition expressions wrapped by `ExprWithCleanups`. Co-authored-by: EugeneZelenko <[email protected]> Co-authored-by: Zeyi Xu <[email protected]> Added: Modified: clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp clang-tools-extra/docs/ReleaseNotes.rst clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-allow-in-conditions.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp index a0b15603b36e8..a138d1900b799 100644 --- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp @@ -233,7 +233,7 @@ static bool isCastAllowedInCondition(const ImplicitCastExpr *Cast, isa<BinaryConditionalOperator>(S)) return true; if (isa<ParenExpr>(S) || isa<ImplicitCastExpr>(S) || - isUnaryLogicalNotOperator(S) || + isa<ExprWithCleanups>(S) || isUnaryLogicalNotOperator(S) || (isa<BinaryOperator>(S) && cast<BinaryOperator>(S)->isLogicalOp())) { Q.push(S); } else { diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 059e48b512adf..c9a170a9e8660 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -363,6 +363,13 @@ Changes in existing checks now uses separate note diagnostics for each uninitialized enumerator, making it easier to see which specific enumerators need explicit initialization. +- Improved :doc:`readability-implicit-bool-conversion + <clang-tidy/checks/readability/implicit-bool-conversion>` check by fixing a + false positive where `AllowPointerConditions` and `AllowIntegerConditions` + options did not suppress warnings when the condition expression involved + temporaries (e.g. passing a string literal to a ``const std::string&`` + parameter) + - Improved :doc:`readability-non-const-parameter <clang-tidy/checks/readability/non-const-parameter>` check by avoiding false positives on parameters used in dependent expressions (e.g. inside generic diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-allow-in-conditions.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-allow-in-conditions.cpp index ef591940917cd..3c9e14449e366 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-allow-in-conditions.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-allow-in-conditions.cpp @@ -3,11 +3,14 @@ // RUN: {readability-implicit-bool-conversion.AllowIntegerConditions: true, \ // RUN: readability-implicit-bool-conversion.AllowPointerConditions: true}}' +#include <string> + template<typename T> void functionTaking(T); int functionReturningInt(); int* functionReturningPointer(); +void* functionReturningPointerWithStringArg(const std::string&); struct Struct { int member; @@ -74,4 +77,9 @@ void implicitConversionPointerToBoolInConditionalsIsAllowed() { if (memberPointer) {} int value3 = memberPointer ? 1 : 2; int value4 = (not memberPointer) ? 1 : 2; + + // Passing a string literal creates a temporary std::string, which causes + // Clang to wrap the condition in ExprWithCleanups. This should still be + // allowed when AllowPointerConditions is true. + if (functionReturningPointerWithStringArg("input")) {} } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
