[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-29 Thread via cfe-commits

https://github.com/zeyi2 closed https://github.com/llvm/llvm-project/pull/171070
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-29 Thread Baranov Victor via cfe-commits

https://github.com/vbvictor approved this pull request.


https://github.com/llvm/llvm-project/pull/171070
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-28 Thread via cfe-commits

https://github.com/zeyi2 updated 
https://github.com/llvm/llvm-project/pull/171070

>From 4ccd199ffecced16cfff596c771088ccbdc1c85f Mon Sep 17 00:00:00 2001
From: mtx 
Date: Thu, 4 Dec 2025 22:50:39 +0800
Subject: [PATCH 01/10] [clang-tidy] Fix implicit-bool-conversion false
 positives with C23 logical operators

---
 .../ImplicitBoolConversionCheck.cpp   | 13 +--
 .../readability/ImplicitBoolConversionCheck.h |  2 +-
 clang-tools-extra/docs/ReleaseNotes.rst   |  3 +-
 .../implicit-bool-conversion-c99.c| 25 +
 .../readability/implicit-bool-conversion.c| 37 +--
 5 files changed, 64 insertions(+), 16 deletions(-)
 create mode 100644 
clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c

diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index c135b426d8608..a5335bdb58c87 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -27,7 +27,9 @@ AST_MATCHER(Stmt, isMacroExpansion) {
   return SM.isMacroBodyExpansion(Loc) || SM.isMacroArgExpansion(Loc);
 }
 
-AST_MATCHER(Stmt, isC23) { return Finder->getASTContext().getLangOpts().C23; }
+AST_MATCHER(Stmt, isC) {
+  return !Finder->getASTContext().getLangOpts().CPlusPlus;
+}
 
 // Preserve same name as AST_MATCHER(isNULLMacroExpansion)
 // NOLINTNEXTLINE(llvm-prefer-static-over-anonymous-namespace)
@@ -306,8 +308,8 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
  hasCastKind(CK_FloatingToBoolean),
  hasCastKind(CK_PointerToBoolean),
  hasCastKind(CK_MemberPointerToBoolean)),
-   // Exclude cases of C23 comparison result.
-   unless(allOf(isC23(),
+   // Exclude cases of C comparison result.
+   unless(allOf(isC(),
 hasSourceExpression(ignoringParens(
 binaryOperator(hasAnyOperatorName(
 ">", ">=", "==", "!=", "<", "<=")),
@@ -350,6 +352,11 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
   unless(hasParent(
   binaryOperator(anyOf(BoolComparison, BoolXor,
BoolOpAssignment, 
BitfieldAssignment,
+  // Exclude logical operators in C
+  unless(allOf(isC(), hasParent(binaryOperator(
+  hasAnyOperatorName("&&", "||"),
+  hasLHS(ImplicitCastFromBool),
+  hasRHS(ImplicitCastFromBool),
   implicitCastExpr().bind("implicitCastFromBool"),
   unless(hasParent(BitfieldConstruct)),
   // Check also for nested casts, for example: bool -> int -> 
float.
diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
index 101089ccfb2e9..6ae15a9e19fe2 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
@@ -21,7 +21,7 @@ class ImplicitBoolConversionCheck : public ClangTidyCheck {
 public:
   ImplicitBoolConversionCheck(StringRef Name, ClangTidyContext *Context);
   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
-return LangOpts.Bool;
+return LangOpts.Bool || LangOpts.C99;
   }
   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index 79a768e599cfd..a59f8942ceb8c 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -543,7 +543,8 @@ Changes in existing checks
 - Improved :doc:`readability-implicit-bool-conversion
   ` check by correctly
   adding parentheses when the inner expression are implicitly converted
-  multiple times.
+  multiple times, enabling the check in C99,  and avoiding false positives when
+  using logical operators with ``bool`` operands in C23.
 
 - Improved :doc:`readability-qualified-auto
   ` check by adding the option
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
new file mode 100644
index 0..dfadbbb5c3a61
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
@@ -0,0 +1,25 @@
+// RUN: %check_clang_tidy -std=c99 %s readability-implicit-bool-c

[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-28 Thread via cfe-commits

https://github.com/zeyi2 edited https://github.com/llvm/llvm-project/pull/171070
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-28 Thread via cfe-commits

https://github.com/zeyi2 updated 
https://github.com/llvm/llvm-project/pull/171070

>From 4ccd199ffecced16cfff596c771088ccbdc1c85f Mon Sep 17 00:00:00 2001
From: mtx 
Date: Thu, 4 Dec 2025 22:50:39 +0800
Subject: [PATCH 1/9] [clang-tidy] Fix implicit-bool-conversion false positives
 with C23 logical operators

---
 .../ImplicitBoolConversionCheck.cpp   | 13 +--
 .../readability/ImplicitBoolConversionCheck.h |  2 +-
 clang-tools-extra/docs/ReleaseNotes.rst   |  3 +-
 .../implicit-bool-conversion-c99.c| 25 +
 .../readability/implicit-bool-conversion.c| 37 +--
 5 files changed, 64 insertions(+), 16 deletions(-)
 create mode 100644 
clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c

diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index c135b426d8608..a5335bdb58c87 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -27,7 +27,9 @@ AST_MATCHER(Stmt, isMacroExpansion) {
   return SM.isMacroBodyExpansion(Loc) || SM.isMacroArgExpansion(Loc);
 }
 
-AST_MATCHER(Stmt, isC23) { return Finder->getASTContext().getLangOpts().C23; }
+AST_MATCHER(Stmt, isC) {
+  return !Finder->getASTContext().getLangOpts().CPlusPlus;
+}
 
 // Preserve same name as AST_MATCHER(isNULLMacroExpansion)
 // NOLINTNEXTLINE(llvm-prefer-static-over-anonymous-namespace)
@@ -306,8 +308,8 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
  hasCastKind(CK_FloatingToBoolean),
  hasCastKind(CK_PointerToBoolean),
  hasCastKind(CK_MemberPointerToBoolean)),
-   // Exclude cases of C23 comparison result.
-   unless(allOf(isC23(),
+   // Exclude cases of C comparison result.
+   unless(allOf(isC(),
 hasSourceExpression(ignoringParens(
 binaryOperator(hasAnyOperatorName(
 ">", ">=", "==", "!=", "<", "<=")),
@@ -350,6 +352,11 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
   unless(hasParent(
   binaryOperator(anyOf(BoolComparison, BoolXor,
BoolOpAssignment, 
BitfieldAssignment,
+  // Exclude logical operators in C
+  unless(allOf(isC(), hasParent(binaryOperator(
+  hasAnyOperatorName("&&", "||"),
+  hasLHS(ImplicitCastFromBool),
+  hasRHS(ImplicitCastFromBool),
   implicitCastExpr().bind("implicitCastFromBool"),
   unless(hasParent(BitfieldConstruct)),
   // Check also for nested casts, for example: bool -> int -> 
float.
diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
index 101089ccfb2e9..6ae15a9e19fe2 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
@@ -21,7 +21,7 @@ class ImplicitBoolConversionCheck : public ClangTidyCheck {
 public:
   ImplicitBoolConversionCheck(StringRef Name, ClangTidyContext *Context);
   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
-return LangOpts.Bool;
+return LangOpts.Bool || LangOpts.C99;
   }
   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index 79a768e599cfd..a59f8942ceb8c 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -543,7 +543,8 @@ Changes in existing checks
 - Improved :doc:`readability-implicit-bool-conversion
   ` check by correctly
   adding parentheses when the inner expression are implicitly converted
-  multiple times.
+  multiple times, enabling the check in C99,  and avoiding false positives when
+  using logical operators with ``bool`` operands in C23.
 
 - Improved :doc:`readability-qualified-auto
   ` check by adding the option
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
new file mode 100644
index 0..dfadbbb5c3a61
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
@@ -0,0 +1,25 @@
+// RUN: %check_clang_tidy -std=c99 %s readability-implicit-bool-con

[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-28 Thread via cfe-commits

github-actions[bot] wrote:


# :window: Windows x64 Test Results

* 3009 tests passed
* 29 tests skipped
* 1 test failed

## Failed Tests
(click on a test name to see its output)

### Clang Tools

Clang 
Tools.clang-tidy/checkers/readability/implicit-bool-conversion-c99.c

```
Exit Code: 1

Command Output (stdout):
--
# RUN: at line 1
C:/Python312/python.exe 
C:/_work/llvm-project/llvm-project/clang-tools-extra/test/../test\clang-tidy\check_clang_tidy.py
 -std=c99-or-later 
C:\_work\llvm-project\llvm-project\clang-tools-extra\test\clang-tidy\checkers\readability\implicit-bool-conversion-c99.c
 readability-implicit-bool-conversion 
C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\readability\Output\implicit-bool-conversion-c99.c.tmp
# executed command: C:/Python312/python.exe 
'C:/_work/llvm-project/llvm-project/clang-tools-extra/test/../test\clang-tidy\check_clang_tidy.py'
 -std=c99-or-later 
'C:\_work\llvm-project\llvm-project\clang-tools-extra\test\clang-tidy\checkers\readability\implicit-bool-conversion-c99.c'
 readability-implicit-bool-conversion 
'C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\readability\Output\implicit-bool-conversion-c99.c.tmp'
# .---command stdout
# | Running ['clang-tidy', '--experimental-custom-checks', 
'C:\\_work\\llvm-project\\llvm-project\\build\\tools\\clang\\tools\\extra\\test\\clang-tidy\\checkers\\readability\\Output\\implicit-bool-conversion-c99.c.tmp.c',
 '-fix', '--checks=-*,readability-implicit-bool-conversion', '--config={}', 
'--', '-std=c99', '-nostdinc++']...
# |  clang-tidy output ---
# | 4 warnings generated.
# | 
# | 
C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\readability\Output\implicit-bool-conversion-c99.c.tmp.c:24:20:
 warning: implicit conversion 'int' -> 'bool' 
[readability-implicit-bool-conversion]
# |24 |   _Bool raw_bool = 1;
# |   |^
# |   |true
# | 
C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\readability\Output\implicit-bool-conversion-c99.c.tmp.c:24:20:
 note: FIX-IT applied suggested code changes
# | 
C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\readability\Output\implicit-bool-conversion-c99.c.tmp.c:27:11:
 warning: implicit conversion 'bool' -> 'int' 
[readability-implicit-bool-conversion]
# |27 |   int i = raw_bool;
# |   |   ^
# |   |   (int)
# | 
C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\readability\Output\implicit-bool-conversion-c99.c.tmp.c:27:11:
 note: FIX-IT applied suggested code changes
# | 
C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\readability\Output\implicit-bool-conversion-c99.c.tmp.c:34:11:
 warning: implicit conversion 'bool' -> 'int' 
[readability-implicit-bool-conversion]
# |34 |   int i = b + 1;
# |   |   ^
# |   |   (int)
# | 
C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\readability\Output\implicit-bool-conversion-c99.c.tmp.c:34:11:
 note: FIX-IT applied suggested code changes
# | 
C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\readability\Output\implicit-bool-conversion-c99.c.tmp.c:40:13:
 warning: implicit conversion 'int *' -> 'bool' 
[readability-implicit-bool-conversion]
# |40 |   _Bool b = p;
# |   | ^
# |   |   != 0
# | 
C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\readability\Output\implicit-bool-conversion-c99.c.tmp.c:40:14:
 note: FIX-IT applied suggested code changes
# | clang-tidy applied 4 of 4 suggested fixes.
# | 
# |40 |   _Bool b = p;
# |   |  ^
# | 
# | --
# | diff -u 
C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\readability\Output\implicit-bool-conversion-c99.c.tmp.orig
 
C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\readability\Output\implicit-bool-conversion-c99.c.tmp.c
 failed:
# | --- 
C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\readability\Output\implicit-bool-conversion-c99.c.tmp.orig
2025-12-29 01:43:55.553104900 +
# | +++ 
C:\_work\llvm-project\llvm-project\build\tools\clang\tools\extra\test\clang-tidy\checkers\readability\Output\implicit-bool-conversion-c99.c.tmp.c
   2025-12-29 01:43:55.588811800 +
# | @@ -21,23 +21,23 @@
# |  }
# | 
# |  
# | 
# |  void test_c99_native_keyword(void) {
# | 
# | -  _Bool raw_bool = 1;
# | 
# | +  _Bool raw_bool = true;
# | 
# |//
# | 
# |//
# | 
# | -  int i = raw_bool;
# | 
# | +  int i

[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-28 Thread via cfe-commits

github-actions[bot] wrote:


# :penguin: Linux x64 Test Results

* 3070 tests passed
* 7 tests skipped
* 1 test failed

## Failed Tests
(click on a test name to see its output)

### Clang Tools

Clang 
Tools.clang-tidy/checkers/readability/implicit-bool-conversion-c99.c

```
Exit Code: 1

Command Output (stdout):
--
# RUN: at line 1
/usr/bin/python3 
/home/gha/actions-runner/_work/llvm-project/llvm-project/clang-tools-extra/test/../test/clang-tidy/check_clang_tidy.py
 -std=c99-or-later 
/home/gha/actions-runner/_work/llvm-project/llvm-project/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
 readability-implicit-bool-conversion 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/tools/clang/tools/extra/test/clang-tidy/checkers/readability/Output/implicit-bool-conversion-c99.c.tmp
# executed command: /usr/bin/python3 
/home/gha/actions-runner/_work/llvm-project/llvm-project/clang-tools-extra/test/../test/clang-tidy/check_clang_tidy.py
 -std=c99-or-later 
/home/gha/actions-runner/_work/llvm-project/llvm-project/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
 readability-implicit-bool-conversion 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/tools/clang/tools/extra/test/clang-tidy/checkers/readability/Output/implicit-bool-conversion-c99.c.tmp
# .---command stdout
# | Running ['clang-tidy', '--experimental-custom-checks', 
'/home/gha/actions-runner/_work/llvm-project/llvm-project/build/tools/clang/tools/extra/test/clang-tidy/checkers/readability/Output/implicit-bool-conversion-c99.c.tmp.c',
 '-fix', '--checks=-*,readability-implicit-bool-conversion', '--config={}', 
'--', '-std=c99', '-nostdinc++']...
# |  clang-tidy output ---
# | 4 warnings generated.
# | 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/tools/clang/tools/extra/test/clang-tidy/checkers/readability/Output/implicit-bool-conversion-c99.c.tmp.c:24:20:
 warning: implicit conversion 'int' -> 'bool' 
[readability-implicit-bool-conversion]
# |24 |   _Bool raw_bool = 1;
# |   |^
# |   |true
# | 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/tools/clang/tools/extra/test/clang-tidy/checkers/readability/Output/implicit-bool-conversion-c99.c.tmp.c:24:20:
 note: FIX-IT applied suggested code changes
# | 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/tools/clang/tools/extra/test/clang-tidy/checkers/readability/Output/implicit-bool-conversion-c99.c.tmp.c:27:11:
 warning: implicit conversion 'bool' -> 'int' 
[readability-implicit-bool-conversion]
# |27 |   int i = raw_bool;
# |   |   ^
# |   |   (int)
# | 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/tools/clang/tools/extra/test/clang-tidy/checkers/readability/Output/implicit-bool-conversion-c99.c.tmp.c:27:11:
 note: FIX-IT applied suggested code changes
# | 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/tools/clang/tools/extra/test/clang-tidy/checkers/readability/Output/implicit-bool-conversion-c99.c.tmp.c:34:11:
 warning: implicit conversion 'bool' -> 'int' 
[readability-implicit-bool-conversion]
# |34 |   int i = b + 1;
# |   |   ^
# |   |   (int)
# | 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/tools/clang/tools/extra/test/clang-tidy/checkers/readability/Output/implicit-bool-conversion-c99.c.tmp.c:34:11:
 note: FIX-IT applied suggested code changes
# | 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/tools/clang/tools/extra/test/clang-tidy/checkers/readability/Output/implicit-bool-conversion-c99.c.tmp.c:40:13:
 warning: implicit conversion 'int *' -> 'bool' 
[readability-implicit-bool-conversion]
# |40 |   _Bool b = p;
# |   | ^
# |   |   != 0
# | 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/tools/clang/tools/extra/test/clang-tidy/checkers/readability/Output/implicit-bool-conversion-c99.c.tmp.c:40:14:
 note: FIX-IT applied suggested code changes
# | clang-tidy applied 4 of 4 suggested fixes.
# |40 |   _Bool b = p;
# |   |  ^
# | 
# | --
# | diff -u 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/tools/clang/tools/extra/test/clang-tidy/checkers/readability/Output/implicit-bool-conversion-c99.c.tmp.orig
 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/tools/clang/tools/extra/test/clang-tidy/checkers/readability/Output/implicit-bool-conversion-c99.c.tmp.c
 failed:
# | --- 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/tools/clang/tools/extra/test/clang-tidy/checkers/readability/Output/implicit-bool-conversion-c99.c.tmp.orig
  2025-12-29 01:47:37.611233902 +
# | +++ 
/home/gha/actions-runner/_work/llvm-project/llvm-project/build/tools/c

[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-28 Thread via cfe-commits


@@ -0,0 +1,43 @@
+// RUN: %check_clang_tidy -std=c99 %s readability-implicit-bool-conversion %t

zeyi2 wrote:

> Is there a reason to keep only c99?

I think this was a mistake from me, thanks for pointing that out :)

https://github.com/llvm/llvm-project/pull/171070
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-28 Thread via cfe-commits

https://github.com/zeyi2 updated 
https://github.com/llvm/llvm-project/pull/171070

>From 4ccd199ffecced16cfff596c771088ccbdc1c85f Mon Sep 17 00:00:00 2001
From: mtx 
Date: Thu, 4 Dec 2025 22:50:39 +0800
Subject: [PATCH 1/8] [clang-tidy] Fix implicit-bool-conversion false positives
 with C23 logical operators

---
 .../ImplicitBoolConversionCheck.cpp   | 13 +--
 .../readability/ImplicitBoolConversionCheck.h |  2 +-
 clang-tools-extra/docs/ReleaseNotes.rst   |  3 +-
 .../implicit-bool-conversion-c99.c| 25 +
 .../readability/implicit-bool-conversion.c| 37 +--
 5 files changed, 64 insertions(+), 16 deletions(-)
 create mode 100644 
clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c

diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index c135b426d8608..a5335bdb58c87 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -27,7 +27,9 @@ AST_MATCHER(Stmt, isMacroExpansion) {
   return SM.isMacroBodyExpansion(Loc) || SM.isMacroArgExpansion(Loc);
 }
 
-AST_MATCHER(Stmt, isC23) { return Finder->getASTContext().getLangOpts().C23; }
+AST_MATCHER(Stmt, isC) {
+  return !Finder->getASTContext().getLangOpts().CPlusPlus;
+}
 
 // Preserve same name as AST_MATCHER(isNULLMacroExpansion)
 // NOLINTNEXTLINE(llvm-prefer-static-over-anonymous-namespace)
@@ -306,8 +308,8 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
  hasCastKind(CK_FloatingToBoolean),
  hasCastKind(CK_PointerToBoolean),
  hasCastKind(CK_MemberPointerToBoolean)),
-   // Exclude cases of C23 comparison result.
-   unless(allOf(isC23(),
+   // Exclude cases of C comparison result.
+   unless(allOf(isC(),
 hasSourceExpression(ignoringParens(
 binaryOperator(hasAnyOperatorName(
 ">", ">=", "==", "!=", "<", "<=")),
@@ -350,6 +352,11 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
   unless(hasParent(
   binaryOperator(anyOf(BoolComparison, BoolXor,
BoolOpAssignment, 
BitfieldAssignment,
+  // Exclude logical operators in C
+  unless(allOf(isC(), hasParent(binaryOperator(
+  hasAnyOperatorName("&&", "||"),
+  hasLHS(ImplicitCastFromBool),
+  hasRHS(ImplicitCastFromBool),
   implicitCastExpr().bind("implicitCastFromBool"),
   unless(hasParent(BitfieldConstruct)),
   // Check also for nested casts, for example: bool -> int -> 
float.
diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
index 101089ccfb2e9..6ae15a9e19fe2 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
@@ -21,7 +21,7 @@ class ImplicitBoolConversionCheck : public ClangTidyCheck {
 public:
   ImplicitBoolConversionCheck(StringRef Name, ClangTidyContext *Context);
   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
-return LangOpts.Bool;
+return LangOpts.Bool || LangOpts.C99;
   }
   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index 79a768e599cfd..a59f8942ceb8c 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -543,7 +543,8 @@ Changes in existing checks
 - Improved :doc:`readability-implicit-bool-conversion
   ` check by correctly
   adding parentheses when the inner expression are implicitly converted
-  multiple times.
+  multiple times, enabling the check in C99,  and avoiding false positives when
+  using logical operators with ``bool`` operands in C23.
 
 - Improved :doc:`readability-qualified-auto
   ` check by adding the option
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
new file mode 100644
index 0..dfadbbb5c3a61
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
@@ -0,0 +1,25 @@
+// RUN: %check_clang_tidy -std=c99 %s readability-implicit-bool-con

[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-28 Thread Baranov Victor via cfe-commits


@@ -0,0 +1,43 @@
+// RUN: %check_clang_tidy -std=c99 %s readability-implicit-bool-conversion %t

vbvictor wrote:

Is there a reason to keep only c99?

https://github.com/llvm/llvm-project/pull/171070
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-28 Thread Baranov Victor via cfe-commits


@@ -0,0 +1,43 @@
+// RUN: %check_clang_tidy -std=c99 %s readability-implicit-bool-conversion %t

vbvictor wrote:

```suggestion
// RUN: %check_clang_tidy -std=c99-or-later %s 
readability-implicit-bool-conversion %t
```

https://github.com/llvm/llvm-project/pull/171070
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-28 Thread via cfe-commits

zeyi2 wrote:

Hi @vbvictor, could you take a look at this? If everything is good, I'll try to 
merge this PR later :)

https://github.com/llvm/llvm-project/pull/171070
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-27 Thread Yanzuo Liu via cfe-commits

https://github.com/zwuis approved this pull request.


https://github.com/llvm/llvm-project/pull/171070
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-22 Thread via cfe-commits

zeyi2 wrote:

friendly ping to not lose this PR :)

https://github.com/llvm/llvm-project/pull/171070
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-11 Thread via cfe-commits

https://github.com/zeyi2 updated 
https://github.com/llvm/llvm-project/pull/171070

>From 4ccd199ffecced16cfff596c771088ccbdc1c85f Mon Sep 17 00:00:00 2001
From: mtx 
Date: Thu, 4 Dec 2025 22:50:39 +0800
Subject: [PATCH 1/7] [clang-tidy] Fix implicit-bool-conversion false positives
 with C23 logical operators

---
 .../ImplicitBoolConversionCheck.cpp   | 13 +--
 .../readability/ImplicitBoolConversionCheck.h |  2 +-
 clang-tools-extra/docs/ReleaseNotes.rst   |  3 +-
 .../implicit-bool-conversion-c99.c| 25 +
 .../readability/implicit-bool-conversion.c| 37 +--
 5 files changed, 64 insertions(+), 16 deletions(-)
 create mode 100644 
clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c

diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index c135b426d8608..a5335bdb58c87 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -27,7 +27,9 @@ AST_MATCHER(Stmt, isMacroExpansion) {
   return SM.isMacroBodyExpansion(Loc) || SM.isMacroArgExpansion(Loc);
 }
 
-AST_MATCHER(Stmt, isC23) { return Finder->getASTContext().getLangOpts().C23; }
+AST_MATCHER(Stmt, isC) {
+  return !Finder->getASTContext().getLangOpts().CPlusPlus;
+}
 
 // Preserve same name as AST_MATCHER(isNULLMacroExpansion)
 // NOLINTNEXTLINE(llvm-prefer-static-over-anonymous-namespace)
@@ -306,8 +308,8 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
  hasCastKind(CK_FloatingToBoolean),
  hasCastKind(CK_PointerToBoolean),
  hasCastKind(CK_MemberPointerToBoolean)),
-   // Exclude cases of C23 comparison result.
-   unless(allOf(isC23(),
+   // Exclude cases of C comparison result.
+   unless(allOf(isC(),
 hasSourceExpression(ignoringParens(
 binaryOperator(hasAnyOperatorName(
 ">", ">=", "==", "!=", "<", "<=")),
@@ -350,6 +352,11 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
   unless(hasParent(
   binaryOperator(anyOf(BoolComparison, BoolXor,
BoolOpAssignment, 
BitfieldAssignment,
+  // Exclude logical operators in C
+  unless(allOf(isC(), hasParent(binaryOperator(
+  hasAnyOperatorName("&&", "||"),
+  hasLHS(ImplicitCastFromBool),
+  hasRHS(ImplicitCastFromBool),
   implicitCastExpr().bind("implicitCastFromBool"),
   unless(hasParent(BitfieldConstruct)),
   // Check also for nested casts, for example: bool -> int -> 
float.
diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
index 101089ccfb2e9..6ae15a9e19fe2 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
@@ -21,7 +21,7 @@ class ImplicitBoolConversionCheck : public ClangTidyCheck {
 public:
   ImplicitBoolConversionCheck(StringRef Name, ClangTidyContext *Context);
   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
-return LangOpts.Bool;
+return LangOpts.Bool || LangOpts.C99;
   }
   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index 79a768e599cfd..a59f8942ceb8c 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -543,7 +543,8 @@ Changes in existing checks
 - Improved :doc:`readability-implicit-bool-conversion
   ` check by correctly
   adding parentheses when the inner expression are implicitly converted
-  multiple times.
+  multiple times, enabling the check in C99,  and avoiding false positives when
+  using logical operators with ``bool`` operands in C23.
 
 - Improved :doc:`readability-qualified-auto
   ` check by adding the option
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
new file mode 100644
index 0..dfadbbb5c3a61
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
@@ -0,0 +1,25 @@
+// RUN: %check_clang_tidy -std=c99 %s readability-implicit-bool-con

[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-09 Thread via cfe-commits

Chase-san wrote:

I do have a few concerns. If this particular warning is reported when we have a 
`bool || int` or similar situation the general consensus will be to simply 
disable the warning because that is an extremely common pattern.

Allowances for such things are generally made because they are considered to be 
safe. This was the case in C17. though it was likely just a macro in c17 rather 
than a proper type I doubt that the semantics have changed. 

https://github.com/llvm/llvm-project/pull/171070
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-08 Thread Yanzuo Liu via cfe-commits


@@ -27,7 +27,9 @@ AST_MATCHER(Stmt, isMacroExpansion) {
   return SM.isMacroBodyExpansion(Loc) || SM.isMacroArgExpansion(Loc);
 }
 
-AST_MATCHER(Stmt, isC23) { return Finder->getASTContext().getLangOpts().C23; }
+AST_MATCHER(Stmt, isC) {
+  return !Finder->getASTContext().getLangOpts().CPlusPlus;

zwuis wrote:

What about `return .getLangOpts().C99`? We don't need to handle C89 in this 
check.

https://github.com/llvm/llvm-project/pull/171070
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-07 Thread via cfe-commits

https://github.com/zeyi2 updated 
https://github.com/llvm/llvm-project/pull/171070

>From 4ccd199ffecced16cfff596c771088ccbdc1c85f Mon Sep 17 00:00:00 2001
From: mtx 
Date: Thu, 4 Dec 2025 22:50:39 +0800
Subject: [PATCH 1/4] [clang-tidy] Fix implicit-bool-conversion false positives
 with C23 logical operators

---
 .../ImplicitBoolConversionCheck.cpp   | 13 +--
 .../readability/ImplicitBoolConversionCheck.h |  2 +-
 clang-tools-extra/docs/ReleaseNotes.rst   |  3 +-
 .../implicit-bool-conversion-c99.c| 25 +
 .../readability/implicit-bool-conversion.c| 37 +--
 5 files changed, 64 insertions(+), 16 deletions(-)
 create mode 100644 
clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c

diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index c135b426d8608..a5335bdb58c87 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -27,7 +27,9 @@ AST_MATCHER(Stmt, isMacroExpansion) {
   return SM.isMacroBodyExpansion(Loc) || SM.isMacroArgExpansion(Loc);
 }
 
-AST_MATCHER(Stmt, isC23) { return Finder->getASTContext().getLangOpts().C23; }
+AST_MATCHER(Stmt, isC) {
+  return !Finder->getASTContext().getLangOpts().CPlusPlus;
+}
 
 // Preserve same name as AST_MATCHER(isNULLMacroExpansion)
 // NOLINTNEXTLINE(llvm-prefer-static-over-anonymous-namespace)
@@ -306,8 +308,8 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
  hasCastKind(CK_FloatingToBoolean),
  hasCastKind(CK_PointerToBoolean),
  hasCastKind(CK_MemberPointerToBoolean)),
-   // Exclude cases of C23 comparison result.
-   unless(allOf(isC23(),
+   // Exclude cases of C comparison result.
+   unless(allOf(isC(),
 hasSourceExpression(ignoringParens(
 binaryOperator(hasAnyOperatorName(
 ">", ">=", "==", "!=", "<", "<=")),
@@ -350,6 +352,11 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
   unless(hasParent(
   binaryOperator(anyOf(BoolComparison, BoolXor,
BoolOpAssignment, 
BitfieldAssignment,
+  // Exclude logical operators in C
+  unless(allOf(isC(), hasParent(binaryOperator(
+  hasAnyOperatorName("&&", "||"),
+  hasLHS(ImplicitCastFromBool),
+  hasRHS(ImplicitCastFromBool),
   implicitCastExpr().bind("implicitCastFromBool"),
   unless(hasParent(BitfieldConstruct)),
   // Check also for nested casts, for example: bool -> int -> 
float.
diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
index 101089ccfb2e9..6ae15a9e19fe2 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
@@ -21,7 +21,7 @@ class ImplicitBoolConversionCheck : public ClangTidyCheck {
 public:
   ImplicitBoolConversionCheck(StringRef Name, ClangTidyContext *Context);
   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
-return LangOpts.Bool;
+return LangOpts.Bool || LangOpts.C99;
   }
   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index 79a768e599cfd..a59f8942ceb8c 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -543,7 +543,8 @@ Changes in existing checks
 - Improved :doc:`readability-implicit-bool-conversion
   ` check by correctly
   adding parentheses when the inner expression are implicitly converted
-  multiple times.
+  multiple times, enabling the check in C99,  and avoiding false positives when
+  using logical operators with ``bool`` operands in C23.
 
 - Improved :doc:`readability-qualified-auto
   ` check by adding the option
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
new file mode 100644
index 0..dfadbbb5c3a61
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
@@ -0,0 +1,25 @@
+// RUN: %check_clang_tidy -std=c99 %s readability-implicit-bool-con

[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-07 Thread via cfe-commits

https://github.com/zeyi2 updated 
https://github.com/llvm/llvm-project/pull/171070

>From 4ccd199ffecced16cfff596c771088ccbdc1c85f Mon Sep 17 00:00:00 2001
From: mtx 
Date: Thu, 4 Dec 2025 22:50:39 +0800
Subject: [PATCH 1/2] [clang-tidy] Fix implicit-bool-conversion false positives
 with C23 logical operators

---
 .../ImplicitBoolConversionCheck.cpp   | 13 +--
 .../readability/ImplicitBoolConversionCheck.h |  2 +-
 clang-tools-extra/docs/ReleaseNotes.rst   |  3 +-
 .../implicit-bool-conversion-c99.c| 25 +
 .../readability/implicit-bool-conversion.c| 37 +--
 5 files changed, 64 insertions(+), 16 deletions(-)
 create mode 100644 
clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c

diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index c135b426d8608..a5335bdb58c87 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -27,7 +27,9 @@ AST_MATCHER(Stmt, isMacroExpansion) {
   return SM.isMacroBodyExpansion(Loc) || SM.isMacroArgExpansion(Loc);
 }
 
-AST_MATCHER(Stmt, isC23) { return Finder->getASTContext().getLangOpts().C23; }
+AST_MATCHER(Stmt, isC) {
+  return !Finder->getASTContext().getLangOpts().CPlusPlus;
+}
 
 // Preserve same name as AST_MATCHER(isNULLMacroExpansion)
 // NOLINTNEXTLINE(llvm-prefer-static-over-anonymous-namespace)
@@ -306,8 +308,8 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
  hasCastKind(CK_FloatingToBoolean),
  hasCastKind(CK_PointerToBoolean),
  hasCastKind(CK_MemberPointerToBoolean)),
-   // Exclude cases of C23 comparison result.
-   unless(allOf(isC23(),
+   // Exclude cases of C comparison result.
+   unless(allOf(isC(),
 hasSourceExpression(ignoringParens(
 binaryOperator(hasAnyOperatorName(
 ">", ">=", "==", "!=", "<", "<=")),
@@ -350,6 +352,11 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
   unless(hasParent(
   binaryOperator(anyOf(BoolComparison, BoolXor,
BoolOpAssignment, 
BitfieldAssignment,
+  // Exclude logical operators in C
+  unless(allOf(isC(), hasParent(binaryOperator(
+  hasAnyOperatorName("&&", "||"),
+  hasLHS(ImplicitCastFromBool),
+  hasRHS(ImplicitCastFromBool),
   implicitCastExpr().bind("implicitCastFromBool"),
   unless(hasParent(BitfieldConstruct)),
   // Check also for nested casts, for example: bool -> int -> 
float.
diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
index 101089ccfb2e9..6ae15a9e19fe2 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
@@ -21,7 +21,7 @@ class ImplicitBoolConversionCheck : public ClangTidyCheck {
 public:
   ImplicitBoolConversionCheck(StringRef Name, ClangTidyContext *Context);
   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
-return LangOpts.Bool;
+return LangOpts.Bool || LangOpts.C99;
   }
   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index 79a768e599cfd..a59f8942ceb8c 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -543,7 +543,8 @@ Changes in existing checks
 - Improved :doc:`readability-implicit-bool-conversion
   ` check by correctly
   adding parentheses when the inner expression are implicitly converted
-  multiple times.
+  multiple times, enabling the check in C99,  and avoiding false positives when
+  using logical operators with ``bool`` operands in C23.
 
 - Improved :doc:`readability-qualified-auto
   ` check by adding the option
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
new file mode 100644
index 0..dfadbbb5c3a61
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
@@ -0,0 +1,25 @@
+// RUN: %check_clang_tidy -std=c99 %s readability-implicit-bool-con

[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-07 Thread via cfe-commits


@@ -27,7 +27,9 @@ AST_MATCHER(Stmt, isMacroExpansion) {
   return SM.isMacroBodyExpansion(Loc) || SM.isMacroArgExpansion(Loc);
 }
 
-AST_MATCHER(Stmt, isC23) { return Finder->getASTContext().getLangOpts().C23; }
+AST_MATCHER(Stmt, isC) {
+  return !Finder->getASTContext().getLangOpts().CPlusPlus;

zeyi2 wrote:

Yes it will. I'll fix it soon. Thanks :)

https://github.com/llvm/llvm-project/pull/171070
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-07 Thread via cfe-commits


@@ -75,20 +75,10 @@ void implicitConversionFromBoolInComplexBoolExpressions() {
   bool anotherBoolean = false;
 
   int integer = boolean && anotherBoolean;
-  // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: implicit conversion 'bool' -> 
'int'
-  // CHECK-MESSAGES: :[[@LINE-2]]:28: warning: implicit conversion 'bool' -> 
'int'
-  // CHECK-FIXES: int integer = (int)boolean && (int)anotherBoolean;
-
   float floating = (boolean || anotherBoolean) * 0.3f;
-  // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: implicit conversion 'bool' -> 
'int'
-  // CHECK-MESSAGES: :[[@LINE-2]]:32: warning: implicit conversion 'bool' -> 
'int'
-  // CHECK-FIXES: float floating = ((int)boolean || (int)anotherBoolean) * 
0.3f;
-
   double doubleFloating = (boolean && (anotherBoolean || boolean)) * 0.3;
   // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: implicit conversion 'bool' -> 
'int'
-  // CHECK-MESSAGES: :[[@LINE-2]]:40: warning: implicit conversion 'bool' -> 
'int'
-  // CHECK-MESSAGES: :[[@LINE-3]]:58: warning: implicit conversion 'bool' -> 
'int'
-  // CHECK-FIXES: double doubleFloating = ((int)boolean && 
((int)anotherBoolean || (int)boolean)) * 0.3;
+  // CHECK-FIXES: double doubleFloating = ((int)boolean && (anotherBoolean || 
boolean)) * 0.3;

zeyi2 wrote:

`(anotherBoolean || boolean)` returns an `int` type result, while `boolean` is 
`bool`, so there is an implicit conversion and should get a warning.

https://github.com/llvm/llvm-project/pull/171070
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-07 Thread via cfe-commits


@@ -27,7 +27,9 @@ AST_MATCHER(Stmt, isMacroExpansion) {
   return SM.isMacroBodyExpansion(Loc) || SM.isMacroArgExpansion(Loc);
 }
 
-AST_MATCHER(Stmt, isC23) { return Finder->getASTContext().getLangOpts().C23; }
+AST_MATCHER(Stmt, isC) {
+  return !Finder->getASTContext().getLangOpts().CPlusPlus;

EugeneZelenko wrote:

Will it match Objective-C?

https://github.com/llvm/llvm-project/pull/171070
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-07 Thread via cfe-commits


@@ -543,7 +543,8 @@ Changes in existing checks
 - Improved :doc:`readability-implicit-bool-conversion
   ` check by correctly
   adding parentheses when the inner expression are implicitly converted
-  multiple times.
+  multiple times, enabling the check in C99,  and avoiding false positives when

EugeneZelenko wrote:

```suggestion
  multiple times, enabling the check in C99, and avoiding false positives when
```

https://github.com/llvm/llvm-project/pull/171070
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-07 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang-tools-extra

Author: mitchell (zeyi2)


Changes

Closes [#170596](https://github.com/llvm/llvm-project/issues/170596)

---
Full diff: https://github.com/llvm/llvm-project/pull/171070.diff


5 Files Affected:

- (modified) 
clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp 
(+10-3) 
- (modified) 
clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h (+1-1) 
- (modified) clang-tools-extra/docs/ReleaseNotes.rst (+2-1) 
- (added) 
clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
 (+25) 
- (modified) 
clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c
 (+26-11) 


``diff
diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index c135b426d8608..a5335bdb58c87 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -27,7 +27,9 @@ AST_MATCHER(Stmt, isMacroExpansion) {
   return SM.isMacroBodyExpansion(Loc) || SM.isMacroArgExpansion(Loc);
 }
 
-AST_MATCHER(Stmt, isC23) { return Finder->getASTContext().getLangOpts().C23; }
+AST_MATCHER(Stmt, isC) {
+  return !Finder->getASTContext().getLangOpts().CPlusPlus;
+}
 
 // Preserve same name as AST_MATCHER(isNULLMacroExpansion)
 // NOLINTNEXTLINE(llvm-prefer-static-over-anonymous-namespace)
@@ -306,8 +308,8 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
  hasCastKind(CK_FloatingToBoolean),
  hasCastKind(CK_PointerToBoolean),
  hasCastKind(CK_MemberPointerToBoolean)),
-   // Exclude cases of C23 comparison result.
-   unless(allOf(isC23(),
+   // Exclude cases of C comparison result.
+   unless(allOf(isC(),
 hasSourceExpression(ignoringParens(
 binaryOperator(hasAnyOperatorName(
 ">", ">=", "==", "!=", "<", "<=")),
@@ -350,6 +352,11 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
   unless(hasParent(
   binaryOperator(anyOf(BoolComparison, BoolXor,
BoolOpAssignment, 
BitfieldAssignment,
+  // Exclude logical operators in C
+  unless(allOf(isC(), hasParent(binaryOperator(
+  hasAnyOperatorName("&&", "||"),
+  hasLHS(ImplicitCastFromBool),
+  hasRHS(ImplicitCastFromBool),
   implicitCastExpr().bind("implicitCastFromBool"),
   unless(hasParent(BitfieldConstruct)),
   // Check also for nested casts, for example: bool -> int -> 
float.
diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
index 101089ccfb2e9..6ae15a9e19fe2 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
@@ -21,7 +21,7 @@ class ImplicitBoolConversionCheck : public ClangTidyCheck {
 public:
   ImplicitBoolConversionCheck(StringRef Name, ClangTidyContext *Context);
   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
-return LangOpts.Bool;
+return LangOpts.Bool || LangOpts.C99;
   }
   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index 79a768e599cfd..a59f8942ceb8c 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -543,7 +543,8 @@ Changes in existing checks
 - Improved :doc:`readability-implicit-bool-conversion
   ` check by correctly
   adding parentheses when the inner expression are implicitly converted
-  multiple times.
+  multiple times, enabling the check in C99,  and avoiding false positives when
+  using logical operators with ``bool`` operands in C23.
 
 - Improved :doc:`readability-qualified-auto
   ` check by adding the option
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
new file mode 100644
index 0..dfadbbb5c3a61
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
@@ -0,0 +1,25 @@
+// RUN: %check_clang_tidy -std=c99 %s readability-implicit-bool-conversion %t
+
+typedef _Bool bool;
+#define true 1

[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-07 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang-tidy

Author: mitchell (zeyi2)


Changes

Closes [#170596](https://github.com/llvm/llvm-project/issues/170596)

---
Full diff: https://github.com/llvm/llvm-project/pull/171070.diff


5 Files Affected:

- (modified) 
clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp 
(+10-3) 
- (modified) 
clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h (+1-1) 
- (modified) clang-tools-extra/docs/ReleaseNotes.rst (+2-1) 
- (added) 
clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
 (+25) 
- (modified) 
clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c
 (+26-11) 


``diff
diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index c135b426d8608..a5335bdb58c87 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -27,7 +27,9 @@ AST_MATCHER(Stmt, isMacroExpansion) {
   return SM.isMacroBodyExpansion(Loc) || SM.isMacroArgExpansion(Loc);
 }
 
-AST_MATCHER(Stmt, isC23) { return Finder->getASTContext().getLangOpts().C23; }
+AST_MATCHER(Stmt, isC) {
+  return !Finder->getASTContext().getLangOpts().CPlusPlus;
+}
 
 // Preserve same name as AST_MATCHER(isNULLMacroExpansion)
 // NOLINTNEXTLINE(llvm-prefer-static-over-anonymous-namespace)
@@ -306,8 +308,8 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
  hasCastKind(CK_FloatingToBoolean),
  hasCastKind(CK_PointerToBoolean),
  hasCastKind(CK_MemberPointerToBoolean)),
-   // Exclude cases of C23 comparison result.
-   unless(allOf(isC23(),
+   // Exclude cases of C comparison result.
+   unless(allOf(isC(),
 hasSourceExpression(ignoringParens(
 binaryOperator(hasAnyOperatorName(
 ">", ">=", "==", "!=", "<", "<=")),
@@ -350,6 +352,11 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
   unless(hasParent(
   binaryOperator(anyOf(BoolComparison, BoolXor,
BoolOpAssignment, 
BitfieldAssignment,
+  // Exclude logical operators in C
+  unless(allOf(isC(), hasParent(binaryOperator(
+  hasAnyOperatorName("&&", "||"),
+  hasLHS(ImplicitCastFromBool),
+  hasRHS(ImplicitCastFromBool),
   implicitCastExpr().bind("implicitCastFromBool"),
   unless(hasParent(BitfieldConstruct)),
   // Check also for nested casts, for example: bool -> int -> 
float.
diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
index 101089ccfb2e9..6ae15a9e19fe2 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
@@ -21,7 +21,7 @@ class ImplicitBoolConversionCheck : public ClangTidyCheck {
 public:
   ImplicitBoolConversionCheck(StringRef Name, ClangTidyContext *Context);
   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
-return LangOpts.Bool;
+return LangOpts.Bool || LangOpts.C99;
   }
   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index 79a768e599cfd..a59f8942ceb8c 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -543,7 +543,8 @@ Changes in existing checks
 - Improved :doc:`readability-implicit-bool-conversion
   ` check by correctly
   adding parentheses when the inner expression are implicitly converted
-  multiple times.
+  multiple times, enabling the check in C99,  and avoiding false positives when
+  using logical operators with ``bool`` operands in C23.
 
 - Improved :doc:`readability-qualified-auto
   ` check by adding the option
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
new file mode 100644
index 0..dfadbbb5c3a61
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
@@ -0,0 +1,25 @@
+// RUN: %check_clang_tidy -std=c99 %s readability-implicit-bool-conversion %t
+
+typedef _Bool bool;
+#define true 1
+#defi

[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)

2025-12-07 Thread via cfe-commits

https://github.com/zeyi2 created 
https://github.com/llvm/llvm-project/pull/171070

Closes [#170596](https://github.com/llvm/llvm-project/issues/170596)

>From 4ccd199ffecced16cfff596c771088ccbdc1c85f Mon Sep 17 00:00:00 2001
From: mtx 
Date: Thu, 4 Dec 2025 22:50:39 +0800
Subject: [PATCH] [clang-tidy] Fix implicit-bool-conversion false positives
 with C23 logical operators

---
 .../ImplicitBoolConversionCheck.cpp   | 13 +--
 .../readability/ImplicitBoolConversionCheck.h |  2 +-
 clang-tools-extra/docs/ReleaseNotes.rst   |  3 +-
 .../implicit-bool-conversion-c99.c| 25 +
 .../readability/implicit-bool-conversion.c| 37 +--
 5 files changed, 64 insertions(+), 16 deletions(-)
 create mode 100644 
clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c

diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index c135b426d8608..a5335bdb58c87 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -27,7 +27,9 @@ AST_MATCHER(Stmt, isMacroExpansion) {
   return SM.isMacroBodyExpansion(Loc) || SM.isMacroArgExpansion(Loc);
 }
 
-AST_MATCHER(Stmt, isC23) { return Finder->getASTContext().getLangOpts().C23; }
+AST_MATCHER(Stmt, isC) {
+  return !Finder->getASTContext().getLangOpts().CPlusPlus;
+}
 
 // Preserve same name as AST_MATCHER(isNULLMacroExpansion)
 // NOLINTNEXTLINE(llvm-prefer-static-over-anonymous-namespace)
@@ -306,8 +308,8 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
  hasCastKind(CK_FloatingToBoolean),
  hasCastKind(CK_PointerToBoolean),
  hasCastKind(CK_MemberPointerToBoolean)),
-   // Exclude cases of C23 comparison result.
-   unless(allOf(isC23(),
+   // Exclude cases of C comparison result.
+   unless(allOf(isC(),
 hasSourceExpression(ignoringParens(
 binaryOperator(hasAnyOperatorName(
 ">", ">=", "==", "!=", "<", "<=")),
@@ -350,6 +352,11 @@ void 
ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
   unless(hasParent(
   binaryOperator(anyOf(BoolComparison, BoolXor,
BoolOpAssignment, 
BitfieldAssignment,
+  // Exclude logical operators in C
+  unless(allOf(isC(), hasParent(binaryOperator(
+  hasAnyOperatorName("&&", "||"),
+  hasLHS(ImplicitCastFromBool),
+  hasRHS(ImplicitCastFromBool),
   implicitCastExpr().bind("implicitCastFromBool"),
   unless(hasParent(BitfieldConstruct)),
   // Check also for nested casts, for example: bool -> int -> 
float.
diff --git 
a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h 
b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
index 101089ccfb2e9..6ae15a9e19fe2 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
@@ -21,7 +21,7 @@ class ImplicitBoolConversionCheck : public ClangTidyCheck {
 public:
   ImplicitBoolConversionCheck(StringRef Name, ClangTidyContext *Context);
   bool isLanguageVersionSupported(const LangOptions &LangOpts) const override {
-return LangOpts.Bool;
+return LangOpts.Bool || LangOpts.C99;
   }
   void storeOptions(ClangTidyOptions::OptionMap &Opts) override;
   void registerMatchers(ast_matchers::MatchFinder *Finder) override;
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index 79a768e599cfd..a59f8942ceb8c 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -543,7 +543,8 @@ Changes in existing checks
 - Improved :doc:`readability-implicit-bool-conversion
   ` check by correctly
   adding parentheses when the inner expression are implicitly converted
-  multiple times.
+  multiple times, enabling the check in C99,  and avoiding false positives when
+  using logical operators with ``bool`` operands in C23.
 
 - Improved :doc:`readability-qualified-auto
   ` check by adding the option
diff --git 
a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
new file mode 100644
index 0..dfadbbb5c3a61
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-c99.c
@@ -0,0 +1,25 @@
+/