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

Reply via email to