[clang-tools-extra] [clang-tidy] Enable C99 in `implicit-bool-conversion` and avoid FP with `bool` operands in C23 (PR #171070)
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)
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)
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)
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)
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)
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)
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)
@@ -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)
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)
@@ -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)
@@ -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)
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)
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)
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)
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)
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)
@@ -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)
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)
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)
@@ -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)
@@ -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)
@@ -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)
@@ -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)
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)
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)
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 @@
+/
