[clang-tools-extra] abece58 - [clang-tidy] Fix a false positive when converting a bool to a signed integer type (#191696)

via cfe-commits cfe-commits at lists.llvm.org
Mon Apr 13 01:36:31 PDT 2026


Author: Mao Chuanjun
Date: 2026-04-13T11:36:25+03:00
New Revision: abece588672ebf849e393077ded2daa88be06802

URL: https://github.com/llvm/llvm-project/commit/abece588672ebf849e393077ded2daa88be06802
DIFF: https://github.com/llvm/llvm-project/commit/abece588672ebf849e393077ded2daa88be06802.diff

LOG: [clang-tidy] Fix a false positive when converting a bool to a signed integer type (#191696)

Fix #191337

Added: 
    

Modified: 
    clang-tools-extra/clang-tidy/bugprone/NarrowingConversionsCheck.cpp
    clang-tools-extra/docs/ReleaseNotes.rst
    clang-tools-extra/test/clang-tidy/checkers/bugprone/narrowing-conversions.cpp

Removed: 
    


################################################################################
diff  --git a/clang-tools-extra/clang-tidy/bugprone/NarrowingConversionsCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/NarrowingConversionsCheck.cpp
index f0a0f6c9b3106..934b365a07cad 100644
--- a/clang-tools-extra/clang-tidy/bugprone/NarrowingConversionsCheck.cpp
+++ b/clang-tools-extra/clang-tidy/bugprone/NarrowingConversionsCheck.cpp
@@ -593,9 +593,17 @@ void NarrowingConversionsCheck::handleImplicitCast(
   case CK_IntegralToFloating:
     handleIntegralToFloating(Context, SourceLoc, Lhs, Rhs);
     return;
-  case CK_IntegralCast:
+  case CK_IntegralCast: {
+    const BuiltinType *ToType = getBuiltinType(Lhs);
+    const BuiltinType *FromType = getBuiltinType(Rhs);
+    if (ToType && FromType && FromType->getKind() == BuiltinType::Bool &&
+        ToType->isSignedInteger()) {
+      handleBooleanToSignedIntegral(Context, SourceLoc, Lhs, Rhs);
+      return;
+    }
     handleIntegralCast(Context, SourceLoc, Lhs, Rhs);
     return;
+  }
   case CK_FloatingToBoolean:
     handleFloatingToBoolean(Context, SourceLoc, Lhs, Rhs);
     return;

diff  --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index d51cbc07c0b6d..6979c2cbcfff2 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -262,6 +262,10 @@ Changes in existing checks
   <clang-tidy/checks/bugprone/macro-parentheses>` check by printing the macro
   definition in the warning message if the macro is defined on command line.
 
+- Improved :doc:`bugprone-narrowing-conversions
+  <clang-tidy/checks/bugprone/narrowing-conversions>` check by fixing a false
+  positive when converting a ``bool`` to a signed integer type.
+
 - Improved :doc:`bugprone-pointer-arithmetic-on-polymorphic-object
   <clang-tidy/checks/bugprone/pointer-arithmetic-on-polymorphic-object>` check
   by fixing a false positive when ``operator[]`` is used in a dependent context.

diff  --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/narrowing-conversions.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/narrowing-conversions.cpp
index 39875264bd1e6..65750f7709f91 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/bugprone/narrowing-conversions.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/narrowing-conversions.cpp
@@ -355,4 +355,14 @@ void typedef_context() {
   // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: narrowing conversion from 'myint64_t' (aka 'long long') to signed type 'int' is implementation-defined [bugprone-narrowing-conversions]
 }
 
+void testBoolToSignedType() {
+  bool b = true;
+  auto c = char{b};
+  auto sc = (signed char){b};
+  auto s = short{b};
+  auto i = int{b};
+  auto c1 = static_cast<char>(b);
+  auto c2 = (char)b;
+}
+
 } // namespace floats


        


More information about the cfe-commits mailing list