[clang-tools-extra] Added options to readability-implicit-bool-conversion (PR #120087)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Dec 27 19:41:09 PST 2024
https://github.com/4m4n-x-B4w4ne updated https://github.com/llvm/llvm-project/pull/120087
>From 03f536888ddc5b7be2514c2d880c6d3119b7f4ee Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Mon, 16 Dec 2024 19:43:42 +0530
Subject: [PATCH 01/34] Update ImplicitBoolConversionCheck.cpp
Added new options in ImplicitBoolConversionCheck CheckConversionToBool and CheckConversionFromBool.
---
.../readability/ImplicitBoolConversionCheck.cpp | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index f9fd1d903e231e..517a5d2b982751 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -258,14 +258,17 @@ ImplicitBoolConversionCheck::ImplicitBoolConversionCheck(
: ClangTidyCheck(Name, Context),
AllowIntegerConditions(Options.get("AllowIntegerConditions", false)),
AllowPointerConditions(Options.get("AllowPointerConditions", false)),
- UseUpperCaseLiteralSuffix(
- Options.get("UseUpperCaseLiteralSuffix", false)) {}
+ UseUpperCaseLiteralSuffix(Options.get("UseUpperCaseLiteralSuffix", false)),
+ CheckConversionsToBool(Options.get("CheckConversionsToBool",true)),
+ CheckConversionsFromBool(Options.get("CheckConversionsFromBool",true)) {}
void ImplicitBoolConversionCheck::storeOptions(
ClangTidyOptions::OptionMap &Opts) {
Options.store(Opts, "AllowIntegerConditions", AllowIntegerConditions);
Options.store(Opts, "AllowPointerConditions", AllowPointerConditions);
Options.store(Opts, "UseUpperCaseLiteralSuffix", UseUpperCaseLiteralSuffix);
+ Options.store(Opts,"CheckConversionsToBool",CheckConversionsToBool);
+ Options.store(Opts,"CheckConversionsFromBool",CheckConversionsFromBool);
}
void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
@@ -358,14 +361,14 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
void ImplicitBoolConversionCheck::check(
const MatchFinder::MatchResult &Result) {
- if (const auto *CastToBool =
- Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastToBool")) {
+ if (CheckConversionsToBool && (const auto *CastToBool =
+ Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastToBool"))) {
const auto *Parent = Result.Nodes.getNodeAs<Stmt>("parentStmt");
return handleCastToBool(CastToBool, Parent, *Result.Context);
}
- if (const auto *CastFromBool =
- Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastFromBool")) {
+ if (CheckConversionsFromBool && (const auto *CastFromBool =
+ Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastFromBool"))) {
const auto *NextImplicitCast =
Result.Nodes.getNodeAs<ImplicitCastExpr>("furtherImplicitCast");
return handleCastFromBool(CastFromBool, NextImplicitCast, *Result.Context);
>From 16c7c95939b4c0c38ebccbbc6cd1da3739244a24 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Mon, 16 Dec 2024 19:45:37 +0530
Subject: [PATCH 02/34] Update ImplicitBoolConversionCheck.h
Added CheckConversionToBool and CheckConversionFromBool Options in the header
---
.../clang-tidy/readability/ImplicitBoolConversionCheck.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
index 5947f7316e67cc..b0c3c2943e649c 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
@@ -37,6 +37,8 @@ class ImplicitBoolConversionCheck : public ClangTidyCheck {
const bool AllowIntegerConditions;
const bool AllowPointerConditions;
const bool UseUpperCaseLiteralSuffix;
+ const bool CheckConversionsToBool;
+ const bool CheckConversionsFromBool;
};
} // namespace clang::tidy::readability
>From 0d6fae8b08a4a365c9295ac8a96de2aba9974c98 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Mon, 16 Dec 2024 19:48:48 +0530
Subject: [PATCH 03/34] Create implicit-bool-conversion-check.cpp
Added new test to check the new options added in the ImplicitBoolConversionCheck.cpp
---
.../implicit-bool-conversion-check.cpp | 92 +++++++++++++++++++
1 file changed, 92 insertions(+)
create mode 100644 clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
new file mode 100644
index 00000000000000..506769d5a57322
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
@@ -0,0 +1,92 @@
+// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t
+
+// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t \
+// RUN: -- -config='{CheckOptions: [{key: readability-implicit-bool-conversion.CheckConversionsToBool, value: false}, {key: readability-implicit-bool-conversion.CheckConversionsFromBool, value: true}]}'
+
+// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t \
+// RUN: -- -config='{CheckOptions: [{key: readability-implicit-bool-conversion.CheckConversionsToBool, value: true}, {key: readability-implicit-bool-conversion.CheckConversionsFromBool, value: false}]}'
+
+// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t \
+// RUN: -- -config='{CheckOptions: [{key: readability-implicit-bool-conversion.CheckConversionsToBool, value: false}, {key: readability-implicit-bool-conversion.CheckConversionsFromBool, value: false}]}'
+
+// ==========================================================
+// Test Case: Conversions to bool (CheckConversionsToBool=true)
+// ==========================================================
+void TestConversionsToBool() {
+ int x = 42;
+ if (x) // CHECK-MESSAGES: :[[@LINE]]:8: warning: implicit conversion 'int' -> 'bool'
+ (void)0;
+
+ float f = 3.14;
+ if (f) // CHECK-MESSAGES: :[[@LINE]]:8: warning: implicit conversion 'float' -> 'bool'
+ (void)0;
+
+ int *p = nullptr;
+ if (p) // CHECK-MESSAGES: :[[@LINE]]:8: warning: implicit conversion 'int *' -> 'bool'
+ (void)0;
+
+ // Pointer-to-member
+ struct S {
+ int member;
+ };
+ int S::*ptr = nullptr;
+ if (ptr) // CHECK-MESSAGES: :[[@LINE]]:8: warning: implicit conversion 'int S::*' -> 'bool'
+ (void)0;
+}
+
+// ==========================================================
+// Test Case: Conversions from bool (CheckConversionsFromBool=true)
+// ==========================================================
+void TestConversionsFromBool() {
+ bool b = true;
+
+ int x = b; // CHECK-MESSAGES: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int'
+ float f = b; // CHECK-MESSAGES: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'float'
+ int *p = b; // CHECK-MESSAGES: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int *'
+
+ struct S {
+ int member;
+ };
+ int S::*ptr = b; // CHECK-MESSAGES: :[[@LINE]]:16: warning: implicit conversion 'bool' -> 'int S::*'
+}
+
+// ==========================================================
+// Test Case: Mixed Configurations (ToBool=false, FromBool=true)
+// ==========================================================
+void TestMixedConfig() {
+ int x = 42;
+ if (x) // No warning: CheckConversionsToBool=false
+ (void)0;
+
+ bool b = true;
+ int y = b; // CHECK-MESSAGES: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int'
+}
+
+// ==========================================================
+// Test Case: No Diagnostics (ToBool=false, FromBool=false)
+// ==========================================================
+void TestNoDiagnostics() {
+ int x = 42;
+ if (x) // No warning: CheckConversionsToBool=false
+ (void)0;
+
+ bool b = true;
+ int y = b; // No warning: CheckConversionsFromBool=false
+}
+
+// ==========================================================
+// Test Case: Edge Cases and Complex Expressions
+// ==========================================================
+void TestEdgeCases() {
+ bool b = true;
+
+ // Nested implicit casts
+ int x = (b ? 1 : 0); // CHECK-MESSAGES: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int'
+
+ // Function returns implicit bool
+ auto ReturnBool = []() -> bool { return true; };
+ int y = ReturnBool(); // CHECK-MESSAGES: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int'
+
+ // Explicit casts (no diagnostics)
+ int z = static_cast<int>(b); // No warning: explicit cast
+}
>From e13bf5ae90fdd52aa0c24a658a107d1c0093c4a0 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Tue, 17 Dec 2024 19:07:54 +0530
Subject: [PATCH 04/34] Update ImplicitBoolConversionCheck.cpp
Fixed Bugs
---
.../ImplicitBoolConversionCheck.cpp | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index 517a5d2b982751..2f79e3e1f9b87f 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -360,20 +360,22 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
void ImplicitBoolConversionCheck::check(
const MatchFinder::MatchResult &Result) {
-
- if (CheckConversionsToBool && (const auto *CastToBool =
- Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastToBool"))) {
+ if(CheckConversionsToBool){
+ if (const auto *CastToBool =
+ Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastToBool")) {
const auto *Parent = Result.Nodes.getNodeAs<Stmt>("parentStmt");
return handleCastToBool(CastToBool, Parent, *Result.Context);
}
-
- if (CheckConversionsFromBool && (const auto *CastFromBool =
- Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastFromBool"))) {
- const auto *NextImplicitCast =
+ }
+ if(CheckConversionsFromBool ){
+ if (const auto *CastFromBool =
+ Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastFromBool")) {
+ const auto *NextImplicitCast =
Result.Nodes.getNodeAs<ImplicitCastExpr>("furtherImplicitCast");
- return handleCastFromBool(CastFromBool, NextImplicitCast, *Result.Context);
+ return handleCastFromBool(CastFromBool, NextImplicitCast, *Result.Context);
}
}
+}
void ImplicitBoolConversionCheck::handleCastToBool(const ImplicitCastExpr *Cast,
const Stmt *Parent,
>From a480460b576730757c14caf34604b7039b07f711 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Tue, 17 Dec 2024 19:40:11 +0530
Subject: [PATCH 05/34] Update implicit-bool-conversion-check.cpp
Fixed Bugs in test .
---
.../checkers/readability/implicit-bool-conversion-check.cpp | 6 ------
1 file changed, 6 deletions(-)
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
index 506769d5a57322..32ea1b98e74a7e 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
@@ -42,12 +42,6 @@ void TestConversionsFromBool() {
int x = b; // CHECK-MESSAGES: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int'
float f = b; // CHECK-MESSAGES: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'float'
- int *p = b; // CHECK-MESSAGES: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int *'
-
- struct S {
- int member;
- };
- int S::*ptr = b; // CHECK-MESSAGES: :[[@LINE]]:16: warning: implicit conversion 'bool' -> 'int S::*'
}
// ==========================================================
>From 5d1e7fc192fae0fffc3ba801f682a7f01a6f4e83 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Wed, 18 Dec 2024 09:10:42 +0530
Subject: [PATCH 06/34] Update ReleaseNotes.rst
Added new Options in ImplicitBoolConversionCheck.
---
clang-tools-extra/docs/ReleaseNotes.rst | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 6803842106791b..2ddfdd6b7b1a27 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -332,6 +332,11 @@ Changes in existing checks
<clang-tidy/checks/readability/identifier-naming>` check to
validate ``namespace`` aliases.
+-Improved :doc: `readability-implicit-bool-conversion
+ <clang-tidy/checks/readability/implicit-bool-conversion>`
+ - `CheckConversionsToBool`: Allows enabling or disabling warnings for implicit conversions to `bool` (default) : true .
+ - `CheckConversionsFromBool`: Allows enabling or disabling warnings for implicit conversions from `bool` (default) : true.
+
Removed checks
^^^^^^^^^^^^^^
>From 9e83c0dd9f202b6488f30c89e2505d50658de4b5 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Wed, 18 Dec 2024 20:27:23 +0530
Subject: [PATCH 07/34] Update ReleaseNotes.rst
---
clang-tools-extra/docs/ReleaseNotes.rst | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 2ddfdd6b7b1a27..eea616fcde28ae 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -319,10 +319,10 @@ Changes in existing checks
diagnostic.
- Improved :doc:`readability-implicit-bool-conversion
- <clang-tidy/checks/readability/implicit-bool-conversion>` check
- by adding the option `UseUpperCaseLiteralSuffix` to select the
- case of the literal suffix in fixes and fixing false positive for implicit
- conversion of comparison result in C23.
+ <clang-tidy/checks/readability/implicit-bool-conversion>`
+ - `UseUpperCaseLiteralSuffix` : check by adding the option to select the case of the literal suffix in fixes and fixing false positive for implicit conversion of comparison result in C23.
+ - `CheckConversionsToBool`: Allows enabling or disabling warnings for implicit conversions to `bool` .
+ - `CheckConversionsFromBool`: Allows enabling or disabling warnings for implicit conversions from `bool`.
- Improved :doc:`readability-redundant-smartptr-get
<clang-tidy/checks/readability/redundant-smartptr-get>` check to
@@ -332,11 +332,6 @@ Changes in existing checks
<clang-tidy/checks/readability/identifier-naming>` check to
validate ``namespace`` aliases.
--Improved :doc: `readability-implicit-bool-conversion
- <clang-tidy/checks/readability/implicit-bool-conversion>`
- - `CheckConversionsToBool`: Allows enabling or disabling warnings for implicit conversions to `bool` (default) : true .
- - `CheckConversionsFromBool`: Allows enabling or disabling warnings for implicit conversions from `bool` (default) : true.
-
Removed checks
^^^^^^^^^^^^^^
>From 4b75aff9e7df63368542a800b996a2283e00db50 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Wed, 18 Dec 2024 20:31:57 +0530
Subject: [PATCH 08/34] Update ReleaseNotes.rst
---
clang-tools-extra/docs/ReleaseNotes.rst | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index eea616fcde28ae..9c72f380b87459 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -321,8 +321,8 @@ Changes in existing checks
- Improved :doc:`readability-implicit-bool-conversion
<clang-tidy/checks/readability/implicit-bool-conversion>`
- `UseUpperCaseLiteralSuffix` : check by adding the option to select the case of the literal suffix in fixes and fixing false positive for implicit conversion of comparison result in C23.
- - `CheckConversionsToBool`: Allows enabling or disabling warnings for implicit conversions to `bool` .
- - `CheckConversionsFromBool`: Allows enabling or disabling warnings for implicit conversions from `bool`.
+ - `CheckConversionsToBool`: check by adding the option to allow enabling or disabling warnings for implicit conversions to `bool` .
+ - `CheckConversionsFromBool`: check by adding the option to allow enabling or disabling warnings for implicit conversions from `bool`.
- Improved :doc:`readability-redundant-smartptr-get
<clang-tidy/checks/readability/redundant-smartptr-get>` check to
>From dc67c7f4e2a064d77f5f9d1b3b65cd30b2b74ec7 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Wed, 18 Dec 2024 20:37:19 +0530
Subject: [PATCH 09/34] Update ReleaseNotes.rst
---
clang-tools-extra/docs/ReleaseNotes.rst | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 9c72f380b87459..01925f77f83700 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -320,9 +320,10 @@ Changes in existing checks
- Improved :doc:`readability-implicit-bool-conversion
<clang-tidy/checks/readability/implicit-bool-conversion>`
- - `UseUpperCaseLiteralSuffix` : check by adding the option to select the case of the literal suffix in fixes and fixing false positive for implicit conversion of comparison result in C23.
- - `CheckConversionsToBool`: check by adding the option to allow enabling or disabling warnings for implicit conversions to `bool` .
- - `CheckConversionsFromBool`: check by adding the option to allow enabling or disabling warnings for implicit conversions from `bool`.
+ Check by adding the option
+ - `UseUpperCaseLiteralSuffix` : to select the case of the literal suffix in fixes and fixing false positive for implicit conversion of comparison result in C23.
+ - `CheckConversionsToBool`: to allow enabling or disabling warnings for implicit conversions to `bool` .
+ - `CheckConversionsFromBool`: to allow enabling or disabling warnings for implicit conversions from `bool`.
- Improved :doc:`readability-redundant-smartptr-get
<clang-tidy/checks/readability/redundant-smartptr-get>` check to
>From c6078dc86d0c044c549efc0c7a30324a4e3293f5 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Wed, 18 Dec 2024 20:47:37 +0530
Subject: [PATCH 10/34] Update ReleaseNotes.rst
---
clang-tools-extra/docs/ReleaseNotes.rst | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 01925f77f83700..b0b90bd47df4fe 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -321,9 +321,13 @@ Changes in existing checks
- Improved :doc:`readability-implicit-bool-conversion
<clang-tidy/checks/readability/implicit-bool-conversion>`
Check by adding the option
- - `UseUpperCaseLiteralSuffix` : to select the case of the literal suffix in fixes and fixing false positive for implicit conversion of comparison result in C23.
- - `CheckConversionsToBool`: to allow enabling or disabling warnings for implicit conversions to `bool` .
- - `CheckConversionsFromBool`: to allow enabling or disabling warnings for implicit conversions from `bool`.
+ - `UseUpperCaseLiteralSuffix` : to select the case of the literal suffix in
+ fixes and fixing false positive for implicit conversion of comparison
+ result in C23.
+ - `CheckConversionsToBool`: to allow enabling or disabling warnings for
+ implicit conversions to `bool` .
+ - `CheckConversionsFromBool`: to allow enabling or disabling warnings for
+ implicit conversions from `bool`.
- Improved :doc:`readability-redundant-smartptr-get
<clang-tidy/checks/readability/redundant-smartptr-get>` check to
>From 0882713138cf5139ac82fa64aa9a56865d9716d8 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Wed, 18 Dec 2024 20:51:44 +0530
Subject: [PATCH 11/34] Update ReleaseNotes.rst
---
clang-tools-extra/docs/ReleaseNotes.rst | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index b0b90bd47df4fe..6322b84aa84713 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -319,8 +319,8 @@ Changes in existing checks
diagnostic.
- Improved :doc:`readability-implicit-bool-conversion
- <clang-tidy/checks/readability/implicit-bool-conversion>`
- Check by adding the option
+ <clang-tidy/checks/readability/implicit-bool-conversion>` check by adding
+ the option
- `UseUpperCaseLiteralSuffix` : to select the case of the literal suffix in
fixes and fixing false positive for implicit conversion of comparison
result in C23.
>From d59f00053c71bdff9e5f49e1cc3d0df139b2be0c Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Wed, 18 Dec 2024 21:00:52 +0530
Subject: [PATCH 12/34] Update ReleaseNotes.rst
---
clang-tools-extra/docs/ReleaseNotes.rst | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 6322b84aa84713..127be656b3477b 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -320,14 +320,14 @@ Changes in existing checks
- Improved :doc:`readability-implicit-bool-conversion
<clang-tidy/checks/readability/implicit-bool-conversion>` check by adding
- the option
- - `UseUpperCaseLiteralSuffix` : to select the case of the literal suffix in
+ the options:
+ - `UseUpperCaseLiteralSuffix`: to select the case of the literal suffix in
fixes and fixing false positive for implicit conversion of comparison
result in C23.
- `CheckConversionsToBool`: to allow enabling or disabling warnings for
- implicit conversions to `bool` .
+ implicit conversions to ``bool`` .
- `CheckConversionsFromBool`: to allow enabling or disabling warnings for
- implicit conversions from `bool`.
+ implicit conversions from ``bool``.
- Improved :doc:`readability-redundant-smartptr-get
<clang-tidy/checks/readability/redundant-smartptr-get>` check to
>From 4520dd67fa2b256f21119313dd027056aa273a06 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Wed, 18 Dec 2024 21:05:11 +0530
Subject: [PATCH 13/34] Update ReleaseNotes.rst
---
clang-tools-extra/docs/ReleaseNotes.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 127be656b3477b..afa89ce4a807a3 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -325,7 +325,7 @@ Changes in existing checks
fixes and fixing false positive for implicit conversion of comparison
result in C23.
- `CheckConversionsToBool`: to allow enabling or disabling warnings for
- implicit conversions to ``bool`` .
+ implicit conversions to ``bool``.
- `CheckConversionsFromBool`: to allow enabling or disabling warnings for
implicit conversions from ``bool``.
>From a9376eae33c7cceafff8588c72996462ae41b28a Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Wed, 18 Dec 2024 21:09:33 +0530
Subject: [PATCH 14/34] Update ReleaseNotes.rst
Improved Preview By adding blank line.
---
clang-tools-extra/docs/ReleaseNotes.rst | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index afa89ce4a807a3..9c53a770a5edef 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -319,8 +319,9 @@ Changes in existing checks
diagnostic.
- Improved :doc:`readability-implicit-bool-conversion
- <clang-tidy/checks/readability/implicit-bool-conversion>` check by adding
- the options:
+ <clang-tidy/checks/readability/implicit-bool-conversion>` check by adding the
+ options:
+
- `UseUpperCaseLiteralSuffix`: to select the case of the literal suffix in
fixes and fixing false positive for implicit conversion of comparison
result in C23.
>From dc229ca60262bf425fdc6e5dcd0621ab447597a9 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Wed, 18 Dec 2024 23:19:04 +0530
Subject: [PATCH 15/34] Update ImplicitBoolConversionCheck.cpp
Fixed Bugs .
---
.../readability/ImplicitBoolConversionCheck.cpp | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index 2f79e3e1f9b87f..4d6a966f71c745 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -322,7 +322,8 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
// additional parens in replacement.
optionally(hasParent(stmt().bind("parentStmt"))),
unless(isInTemplateInstantiation()),
- unless(IsInCompilerGeneratedFunction))
+ unless(IsInCompilerGeneratedFunction),
+ unless(!CheckConversionToBool)
.bind("implicitCastToBool")),
this);
@@ -348,33 +349,32 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
unless(hasParent(
binaryOperator(anyOf(BoolComparison, BoolXor,
BoolOpAssignment, BitfieldAssignment)))),
- implicitCastExpr().bind("implicitCastFromBool"),
unless(hasParent(BitfieldConstruct)),
// Check also for nested casts, for example: bool -> int -> float.
anyOf(hasParent(implicitCastExpr().bind("furtherImplicitCast")),
anything()),
unless(isInTemplateInstantiation()),
- unless(IsInCompilerGeneratedFunction))),
+ unless(IsInCompilerGeneratedFunction),
+ unless(!CheckConversionFromBool))
+ .bind("implicitCastFromBool")),
this);
}
void ImplicitBoolConversionCheck::check(
const MatchFinder::MatchResult &Result) {
- if(CheckConversionsToBool){
+
if (const auto *CastToBool =
Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastToBool")) {
const auto *Parent = Result.Nodes.getNodeAs<Stmt>("parentStmt");
return handleCastToBool(CastToBool, Parent, *Result.Context);
}
- }
- if(CheckConversionsFromBool ){
- if (const auto *CastFromBool =
+ if (const auto *CastFromBool =
Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastFromBool")) {
const auto *NextImplicitCast =
Result.Nodes.getNodeAs<ImplicitCastExpr>("furtherImplicitCast");
return handleCastFromBool(CastFromBool, NextImplicitCast, *Result.Context);
}
-}
+
}
void ImplicitBoolConversionCheck::handleCastToBool(const ImplicitCastExpr *Cast,
>From f6efcaa256418db9024119e500c0038060d7afe6 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Thu, 19 Dec 2024 00:17:29 +0530
Subject: [PATCH 16/34] Update ImplicitBoolConversionCheck.cpp
Fixed Bugs .
---
.../ImplicitBoolConversionCheck.cpp | 42 ++++++++++++-------
1 file changed, 26 insertions(+), 16 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index 4d6a966f71c745..acd1921f4eac2e 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -272,6 +272,7 @@ void ImplicitBoolConversionCheck::storeOptions(
}
void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
+ if(CheckConversionFromBool || CheckConversionToBool){
auto ExceptionCases =
expr(anyOf(allOf(isMacroExpansion(), unless(isNULLMacroExpansion())),
has(ignoringImplicit(
@@ -280,23 +281,18 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
expr(hasType(qualType().bind("type")),
hasParent(initListExpr(hasParent(explicitCastExpr(
hasType(qualType(equalsBoundNode("type"))))))))));
- auto ImplicitCastFromBool = implicitCastExpr(
- anyOf(hasCastKind(CK_IntegralCast), hasCastKind(CK_IntegralToFloating),
- // Prior to C++11 cast from bool literal to pointer was allowed.
- allOf(anyOf(hasCastKind(CK_NullToPointer),
- hasCastKind(CK_NullToMemberPointer)),
- hasSourceExpression(cxxBoolLiteral()))),
- hasSourceExpression(expr(hasType(booleanType()))));
+
auto BoolXor =
binaryOperator(hasOperatorName("^"), hasLHS(ImplicitCastFromBool),
hasRHS(ImplicitCastFromBool));
+ auto IsInCompilerGeneratedFunction = hasAncestor(namedDecl(anyOf(
+ isImplicit(), functionDecl(isDefaulted()), functionTemplateDecl())));
+
+ if(CheckConversionToBool){
auto ComparisonInCall = allOf(
hasParent(callExpr()),
hasSourceExpression(binaryOperator(hasAnyOperatorName("==", "!="))));
-
- auto IsInCompilerGeneratedFunction = hasAncestor(namedDecl(anyOf(
- isImplicit(), functionDecl(isDefaulted()), functionTemplateDecl())));
-
+
Finder->addMatcher(
traverse(TK_AsIs,
implicitCastExpr(
@@ -322,21 +318,34 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
// additional parens in replacement.
optionally(hasParent(stmt().bind("parentStmt"))),
unless(isInTemplateInstantiation()),
- unless(IsInCompilerGeneratedFunction),
- unless(!CheckConversionToBool)
+ unless(IsInCompilerGeneratedFunction))
.bind("implicitCastToBool")),
this);
+ }
+ if(CheckConversionFromBool){
+ auto ImplicitCastFromBool = implicitCastExpr(
+ anyOf(hasCastKind(CK_IntegralCast), hasCastKind(CK_IntegralToFloating),
+ // Prior to C++11 cast from bool literal to pointer was allowed.
+ allOf(anyOf(hasCastKind(CK_NullToPointer),
+ hasCastKind(CK_NullToMemberPointer)),
+ hasSourceExpression(cxxBoolLiteral()))),
+ hasSourceExpression(expr(hasType(booleanType()))));
+
auto BoolComparison = binaryOperator(hasAnyOperatorName("==", "!="),
hasLHS(ImplicitCastFromBool),
hasRHS(ImplicitCastFromBool));
+
auto BoolOpAssignment = binaryOperator(hasAnyOperatorName("|=", "&="),
hasLHS(expr(hasType(booleanType()))));
+
auto BitfieldAssignment = binaryOperator(
hasLHS(memberExpr(hasDeclaration(fieldDecl(hasBitWidth(1))))));
+
auto BitfieldConstruct = cxxConstructorDecl(hasDescendant(cxxCtorInitializer(
withInitializer(equalsBoundNode("implicitCastFromBool")),
forField(hasBitWidth(1)))));
+
Finder->addMatcher(
traverse(
TK_AsIs,
@@ -349,15 +358,16 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
unless(hasParent(
binaryOperator(anyOf(BoolComparison, BoolXor,
BoolOpAssignment, BitfieldAssignment)))),
+ implictCastExpr().bind("implicitCastFromBool"),
unless(hasParent(BitfieldConstruct)),
// Check also for nested casts, for example: bool -> int -> float.
anyOf(hasParent(implicitCastExpr().bind("furtherImplicitCast")),
anything()),
unless(isInTemplateInstantiation()),
- unless(IsInCompilerGeneratedFunction),
- unless(!CheckConversionFromBool))
- .bind("implicitCastFromBool")),
+ unless(IsInCompilerGeneratedFunction))),
this);
+ }
+ }
}
void ImplicitBoolConversionCheck::check(
>From ac54d56296cd69669943d1c3d947ab743ef7f2ba Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Thu, 19 Dec 2024 00:28:22 +0530
Subject: [PATCH 17/34] Update ImplicitBoolConversionCheck.cpp
Fixed Bugs.
---
.../readability/ImplicitBoolConversionCheck.cpp | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index acd1921f4eac2e..383a1307aa8d81 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -282,6 +282,13 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
hasParent(initListExpr(hasParent(explicitCastExpr(
hasType(qualType(equalsBoundNode("type"))))))))));
+ auto ImplicitCastFromBool = implicitCastExpr(
+ anyOf(hasCastKind(CK_IntegralCast), hasCastKind(CK_IntegralToFloating),
+ // Prior to C++11 cast from bool literal to pointer was allowed.
+ allOf(anyOf(hasCastKind(CK_NullToPointer),
+ hasCastKind(CK_NullToMemberPointer)),
+ hasSourceExpression(cxxBoolLiteral()))),
+ hasSourceExpression(expr(hasType(booleanType()))));
auto BoolXor =
binaryOperator(hasOperatorName("^"), hasLHS(ImplicitCastFromBool),
hasRHS(ImplicitCastFromBool));
@@ -324,13 +331,6 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
}
if(CheckConversionFromBool){
- auto ImplicitCastFromBool = implicitCastExpr(
- anyOf(hasCastKind(CK_IntegralCast), hasCastKind(CK_IntegralToFloating),
- // Prior to C++11 cast from bool literal to pointer was allowed.
- allOf(anyOf(hasCastKind(CK_NullToPointer),
- hasCastKind(CK_NullToMemberPointer)),
- hasSourceExpression(cxxBoolLiteral()))),
- hasSourceExpression(expr(hasType(booleanType()))));
auto BoolComparison = binaryOperator(hasAnyOperatorName("==", "!="),
hasLHS(ImplicitCastFromBool),
@@ -358,7 +358,7 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
unless(hasParent(
binaryOperator(anyOf(BoolComparison, BoolXor,
BoolOpAssignment, BitfieldAssignment)))),
- implictCastExpr().bind("implicitCastFromBool"),
+ implicitCastExpr().bind("implicitCastFromBool"),
unless(hasParent(BitfieldConstruct)),
// Check also for nested casts, for example: bool -> int -> float.
anyOf(hasParent(implicitCastExpr().bind("furtherImplicitCast")),
>From 74031e51572ca8109409297aa41c45bdc511f2cd Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Thu, 19 Dec 2024 00:48:33 +0530
Subject: [PATCH 18/34] Update ImplicitBoolConversionCheck.cpp
Formatted using clang-format.
---
.../ImplicitBoolConversionCheck.cpp | 219 +++++++++---------
1 file changed, 112 insertions(+), 107 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index 383a1307aa8d81..7af364b3bbfc71 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -258,133 +258,138 @@ ImplicitBoolConversionCheck::ImplicitBoolConversionCheck(
: ClangTidyCheck(Name, Context),
AllowIntegerConditions(Options.get("AllowIntegerConditions", false)),
AllowPointerConditions(Options.get("AllowPointerConditions", false)),
- UseUpperCaseLiteralSuffix(Options.get("UseUpperCaseLiteralSuffix", false)),
- CheckConversionsToBool(Options.get("CheckConversionsToBool",true)),
- CheckConversionsFromBool(Options.get("CheckConversionsFromBool",true)) {}
+ UseUpperCaseLiteralSuffix(
+ Options.get("UseUpperCaseLiteralSuffix", false)),
+ CheckConversionsToBool(Options.get("CheckConversionsToBool", true)),
+ CheckConversionsFromBool(Options.get("CheckConversionsFromBool", true)) {}
void ImplicitBoolConversionCheck::storeOptions(
ClangTidyOptions::OptionMap &Opts) {
Options.store(Opts, "AllowIntegerConditions", AllowIntegerConditions);
Options.store(Opts, "AllowPointerConditions", AllowPointerConditions);
Options.store(Opts, "UseUpperCaseLiteralSuffix", UseUpperCaseLiteralSuffix);
- Options.store(Opts,"CheckConversionsToBool",CheckConversionsToBool);
- Options.store(Opts,"CheckConversionsFromBool",CheckConversionsFromBool);
+ Options.store(Opts, "CheckConversionsToBool", CheckConversionsToBool);
+ Options.store(Opts, "CheckConversionsFromBool", CheckConversionsFromBool);
}
void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
- if(CheckConversionFromBool || CheckConversionToBool){
- auto ExceptionCases =
- expr(anyOf(allOf(isMacroExpansion(), unless(isNULLMacroExpansion())),
- has(ignoringImplicit(
- memberExpr(hasDeclaration(fieldDecl(hasBitWidth(1)))))),
- hasParent(explicitCastExpr()),
- expr(hasType(qualType().bind("type")),
- hasParent(initListExpr(hasParent(explicitCastExpr(
- hasType(qualType(equalsBoundNode("type"))))))))));
-
- auto ImplicitCastFromBool = implicitCastExpr(
- anyOf(hasCastKind(CK_IntegralCast), hasCastKind(CK_IntegralToFloating),
- // Prior to C++11 cast from bool literal to pointer was allowed.
- allOf(anyOf(hasCastKind(CK_NullToPointer),
- hasCastKind(CK_NullToMemberPointer)),
- hasSourceExpression(cxxBoolLiteral()))),
- hasSourceExpression(expr(hasType(booleanType()))));
- auto BoolXor =
- binaryOperator(hasOperatorName("^"), hasLHS(ImplicitCastFromBool),
- hasRHS(ImplicitCastFromBool));
- auto IsInCompilerGeneratedFunction = hasAncestor(namedDecl(anyOf(
- isImplicit(), functionDecl(isDefaulted()), functionTemplateDecl())));
-
- if(CheckConversionToBool){
- auto ComparisonInCall = allOf(
- hasParent(callExpr()),
- hasSourceExpression(binaryOperator(hasAnyOperatorName("==", "!="))));
-
- Finder->addMatcher(
- traverse(TK_AsIs,
- implicitCastExpr(
- anyOf(hasCastKind(CK_IntegralToBoolean),
- hasCastKind(CK_FloatingToBoolean),
- hasCastKind(CK_PointerToBoolean),
- hasCastKind(CK_MemberPointerToBoolean)),
- // Exclude cases of C23 comparison result.
- unless(allOf(isC23(),
- hasSourceExpression(ignoringParens(
- binaryOperator(hasAnyOperatorName(
- ">", ">=", "==", "!=", "<", "<=")))))),
- // Exclude case of using if or while statements with variable
- // declaration, e.g.:
- // if (int var = functionCall()) {}
- unless(hasParent(
- stmt(anyOf(ifStmt(), whileStmt()), has(declStmt())))),
- // Exclude cases common to implicit cast to and from bool.
- unless(ExceptionCases), unless(has(BoolXor)),
- // Exclude C23 cases common to implicit cast to bool.
- unless(ComparisonInCall),
- // Retrieve also parent statement, to check if we need
- // additional parens in replacement.
- optionally(hasParent(stmt().bind("parentStmt"))),
- unless(isInTemplateInstantiation()),
- unless(IsInCompilerGeneratedFunction))
- .bind("implicitCastToBool")),
- this);
- }
+ if (CheckConversionFromBool || CheckConversionToBool) {
+ auto ExceptionCases =
+ expr(anyOf(allOf(isMacroExpansion(), unless(isNULLMacroExpansion())),
+ has(ignoringImplicit(
+ memberExpr(hasDeclaration(fieldDecl(hasBitWidth(1)))))),
+ hasParent(explicitCastExpr()),
+ expr(hasType(qualType().bind("type")),
+ hasParent(initListExpr(hasParent(explicitCastExpr(
+ hasType(qualType(equalsBoundNode("type"))))))))));
+
+ auto ImplicitCastFromBool = implicitCastExpr(
+ anyOf(hasCastKind(CK_IntegralCast), hasCastKind(CK_IntegralToFloating),
+ // Prior to C++11 cast from bool literal to pointer was allowed.
+ allOf(anyOf(hasCastKind(CK_NullToPointer),
+ hasCastKind(CK_NullToMemberPointer)),
+ hasSourceExpression(cxxBoolLiteral()))),
+ hasSourceExpression(expr(hasType(booleanType()))));
+ auto BoolXor =
+ binaryOperator(hasOperatorName("^"), hasLHS(ImplicitCastFromBool),
+ hasRHS(ImplicitCastFromBool));
+ auto IsInCompilerGeneratedFunction = hasAncestor(namedDecl(anyOf(
+ isImplicit(), functionDecl(isDefaulted()), functionTemplateDecl())));
+
+ if (CheckConversionToBool) {
+ auto ComparisonInCall = allOf(
+ hasParent(callExpr()),
+ hasSourceExpression(binaryOperator(hasAnyOperatorName("==", "!="))));
+
+ Finder->addMatcher(
+ traverse(
+ TK_AsIs,
+ implicitCastExpr(
+ anyOf(hasCastKind(CK_IntegralToBoolean),
+ hasCastKind(CK_FloatingToBoolean),
+ hasCastKind(CK_PointerToBoolean),
+ hasCastKind(CK_MemberPointerToBoolean)),
+ // Exclude cases of C23 comparison result.
+ unless(allOf(isC23(),
+ hasSourceExpression(ignoringParens(
+ binaryOperator(hasAnyOperatorName(
+ ">", ">=", "==", "!=", "<", "<=")))))),
+ // Exclude case of using if or while statements with variable
+ // declaration, e.g.:
+ // if (int var = functionCall()) {}
+ unless(hasParent(
+ stmt(anyOf(ifStmt(), whileStmt()), has(declStmt())))),
+ // Exclude cases common to implicit cast to and from bool.
+ unless(ExceptionCases), unless(has(BoolXor)),
+ // Exclude C23 cases common to implicit cast to bool.
+ unless(ComparisonInCall),
+ // Retrieve also parent statement, to check if we need
+ // additional parens in replacement.
+ optionally(hasParent(stmt().bind("parentStmt"))),
+ unless(isInTemplateInstantiation()),
+ unless(IsInCompilerGeneratedFunction))
+ .bind("implicitCastToBool")),
+ this);
+ }
- if(CheckConversionFromBool){
-
- auto BoolComparison = binaryOperator(hasAnyOperatorName("==", "!="),
- hasLHS(ImplicitCastFromBool),
- hasRHS(ImplicitCastFromBool));
-
- auto BoolOpAssignment = binaryOperator(hasAnyOperatorName("|=", "&="),
- hasLHS(expr(hasType(booleanType()))));
-
- auto BitfieldAssignment = binaryOperator(
- hasLHS(memberExpr(hasDeclaration(fieldDecl(hasBitWidth(1))))));
-
- auto BitfieldConstruct = cxxConstructorDecl(hasDescendant(cxxCtorInitializer(
- withInitializer(equalsBoundNode("implicitCastFromBool")),
- forField(hasBitWidth(1)))));
-
- Finder->addMatcher(
- traverse(
- TK_AsIs,
- implicitCastExpr(
- ImplicitCastFromBool, unless(ExceptionCases),
- // Exclude comparisons of bools, as they are always cast to
- // integers in such context:
- // bool_expr_a == bool_expr_b
- // bool_expr_a != bool_expr_b
- unless(hasParent(
- binaryOperator(anyOf(BoolComparison, BoolXor,
- BoolOpAssignment, BitfieldAssignment)))),
- implicitCastExpr().bind("implicitCastFromBool"),
- unless(hasParent(BitfieldConstruct)),
- // Check also for nested casts, for example: bool -> int -> float.
- anyOf(hasParent(implicitCastExpr().bind("furtherImplicitCast")),
- anything()),
- unless(isInTemplateInstantiation()),
- unless(IsInCompilerGeneratedFunction))),
- this);
- }
+ if (CheckConversionFromBool) {
+
+ auto BoolComparison = binaryOperator(hasAnyOperatorName("==", "!="),
+ hasLHS(ImplicitCastFromBool),
+ hasRHS(ImplicitCastFromBool));
+
+ auto BoolOpAssignment = binaryOperator(
+ hasAnyOperatorName("|=", "&="), hasLHS(expr(hasType(booleanType()))));
+
+ auto BitfieldAssignment = binaryOperator(
+ hasLHS(memberExpr(hasDeclaration(fieldDecl(hasBitWidth(1))))));
+
+ auto BitfieldConstruct =
+ cxxConstructorDecl(hasDescendant(cxxCtorInitializer(
+ withInitializer(equalsBoundNode("implicitCastFromBool")),
+ forField(hasBitWidth(1)))));
+
+ Finder->addMatcher(
+ traverse(TK_AsIs, implicitCastExpr(
+ ImplicitCastFromBool, unless(ExceptionCases),
+ // Exclude comparisons of bools, as they are
+ // always cast to integers in such context:
+ // bool_expr_a == bool_expr_b
+ // bool_expr_a != bool_expr_b
+ unless(hasParent(binaryOperator(anyOf(
+ BoolComparison, BoolXor, BoolOpAssignment,
+ BitfieldAssignment)))),
+ implicitCastExpr().bind("implicitCastFromBool"),
+ unless(hasParent(BitfieldConstruct)),
+ // Check also for nested casts, for example:
+ // bool -> int -> float.
+ anyOf(hasParent(implicitCastExpr().bind(
+ "furtherImplicitCast")),
+ anything()),
+ unless(isInTemplateInstantiation()),
+ unless(IsInCompilerGeneratedFunction))),
+ this);
+ }
}
}
void ImplicitBoolConversionCheck::check(
const MatchFinder::MatchResult &Result) {
-
- if (const auto *CastToBool =
- Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastToBool")) {
+
+ if (CheckConversionsToBool &&
+ (const auto *CastToBool =
+ Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastToBool"))) {
const auto *Parent = Result.Nodes.getNodeAs<Stmt>("parentStmt");
return handleCastToBool(CastToBool, Parent, *Result.Context);
}
- if (const auto *CastFromBool =
- Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastFromBool")) {
- const auto *NextImplicitCast =
+
+ if (CheckConversionsFromBool &&
+ (const auto *CastFromBool =
+ Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastFromBool"))) {
+ const auto *NextImplicitCast =
Result.Nodes.getNodeAs<ImplicitCastExpr>("furtherImplicitCast");
- return handleCastFromBool(CastFromBool, NextImplicitCast, *Result.Context);
+ return handleCastFromBool(CastFromBool, NextImplicitCast, *Result.Context);
}
-
}
void ImplicitBoolConversionCheck::handleCastToBool(const ImplicitCastExpr *Cast,
>From 9b46c0966ef489d94fbd6d8260a4a42511d0c29f Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Thu, 19 Dec 2024 00:51:29 +0530
Subject: [PATCH 19/34] Update ImplicitBoolConversionCheck.cpp
Fixed Some Bugs.
---
.../readability/ImplicitBoolConversionCheck.cpp | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index 7af364b3bbfc71..86939d121a45a7 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -376,16 +376,14 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
void ImplicitBoolConversionCheck::check(
const MatchFinder::MatchResult &Result) {
- if (CheckConversionsToBool &&
- (const auto *CastToBool =
- Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastToBool"))) {
+ if (const auto *CastToBool =
+ Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastToBool")) {
const auto *Parent = Result.Nodes.getNodeAs<Stmt>("parentStmt");
return handleCastToBool(CastToBool, Parent, *Result.Context);
}
- if (CheckConversionsFromBool &&
- (const auto *CastFromBool =
- Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastFromBool"))) {
+ if (const auto *CastFromBool =
+ Result.Nodes.getNodeAs<ImplicitCastExpr>("implicitCastFromBool")) {
const auto *NextImplicitCast =
Result.Nodes.getNodeAs<ImplicitCastExpr>("furtherImplicitCast");
return handleCastFromBool(CastFromBool, NextImplicitCast, *Result.Context);
>From dd41e299c4afb83c962080b657a1ffbc26a01fab Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Thu, 19 Dec 2024 02:06:52 +0530
Subject: [PATCH 20/34] Update implicit-bool-conversion.rst
Documented the new options.
---
.../readability/implicit-bool-conversion.rst | 35 +++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability/implicit-bool-conversion.rst b/clang-tools-extra/docs/clang-tidy/checks/readability/implicit-bool-conversion.rst
index 88cff387f4c165..a8d550cdc03e92 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/readability/implicit-bool-conversion.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability/implicit-bool-conversion.rst
@@ -147,3 +147,38 @@ Options
if (foo) {}
// ^ propose replacement default: if (foo != 0u) {}
// ^ propose replacement with option `UseUpperCaseLiteralSuffix`: if (foo != 0U) {}
+.. option:: CheckConversionsToBool
+
+ When `true`, the check diagnoses implicit conversions to `bool`. Default is `true`.
+
+ Example
+
+ .. code-block:: c++
+
+ int x = 42;
+ if (x) {}
+ // ^ propose replacement: if (x != 0) {}
+
+ float f = 3.14;
+ if (f) {}
+ // ^ propose replacement: if (f != 0.0f) {}
+
+.. option:: CheckConversionsFromBool
+
+ When `true`, the check diagnoses implicit conversions from `bool`. Default is `true`.
+
+ Example
+
+ .. code-block:: c++
+
+ bool b = true;
+
+ int x = b;
+ // ^ propose replacement: int x = b ? 1 : 0;
+
+ float f = b;
+ // ^ propose replacement: float f = b ? 1.0f : 0.0f;
+
+ int* p = b;
+ // ^ propose replacement: int* p = b ? some_ptr : nullptr;
+
>From d0c05935d1a99a9bae625115c143d8a293b731fb Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Thu, 19 Dec 2024 02:19:49 +0530
Subject: [PATCH 21/34] Update implicit-bool-conversion.rst
---
.../checks/readability/implicit-bool-conversion.rst | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/clang-tools-extra/docs/clang-tidy/checks/readability/implicit-bool-conversion.rst b/clang-tools-extra/docs/clang-tidy/checks/readability/implicit-bool-conversion.rst
index a8d550cdc03e92..f7c15ffa2da51b 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/readability/implicit-bool-conversion.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability/implicit-bool-conversion.rst
@@ -147,9 +147,11 @@ Options
if (foo) {}
// ^ propose replacement default: if (foo != 0u) {}
// ^ propose replacement with option `UseUpperCaseLiteralSuffix`: if (foo != 0U) {}
+
.. option:: CheckConversionsToBool
- When `true`, the check diagnoses implicit conversions to `bool`. Default is `true`.
+ When `true`, the check diagnoses implicit conversions to ``bool``.
+ Default is `true`.
Example
@@ -165,7 +167,8 @@ Options
.. option:: CheckConversionsFromBool
- When `true`, the check diagnoses implicit conversions from `bool`. Default is `true`.
+ When `true`, the check diagnoses implicit conversions from ``bool``.
+ Default is `true`.
Example
>From a56019f1488589a6f519d611f42314e977587e39 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Thu, 19 Dec 2024 03:33:18 +0530
Subject: [PATCH 22/34] Update implicit-bool-conversion-check.cpp
Rewritten the RUN directives.
---
.../implicit-bool-conversion-check.cpp | 25 ++++++++++++-------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
index 32ea1b98e74a7e..a01658b9cbf00a 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
@@ -1,13 +1,20 @@
-// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t
+// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t -- -- -std=c23
+// RUN: %check_clang_tidy -check-suffix=TO-BOOL-FALSE %s readability-implicit-bool-conversion %t -- \
+// RUN: -config='{CheckOptions: { \
+// RUN: readability-implicit-bool-conversion.CheckConversionsToBool: false, \
+// RUN: readability-implicit-bool-conversion.CheckConversionsFromBool: true \
+// RUN: }}' -- -std=c23
+// RUN: %check_clang_tidy -check-suffix=FROM-BOOL-FALSE %s readability-implicit-bool-conversion %t -- \
+// RUN: -config='{CheckOptions: { \
+// RUN: readability-implicit-bool-conversion.CheckConversionsToBool: true, \
+// RUN: readability-implicit-bool-conversion.CheckConversionsFromBool: false \
+// RUN: }}' -- -std=c23
+// RUN: %check_clang_tidy -check-suffix=TO-AND-FROM-BOOL-FALSE %s readability-implicit-bool-conversion %t -- \
+// RUN: -config='{CheckOptions: { \
+// RUN: readability-implicit-bool-conversion.CheckConversionsToBool: false, \
+// RUN: readability-implicit-bool-conversion.CheckConversionsFromBool: false \
+// RUN: }}' -- -std=c23
-// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t \
-// RUN: -- -config='{CheckOptions: [{key: readability-implicit-bool-conversion.CheckConversionsToBool, value: false}, {key: readability-implicit-bool-conversion.CheckConversionsFromBool, value: true}]}'
-
-// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t \
-// RUN: -- -config='{CheckOptions: [{key: readability-implicit-bool-conversion.CheckConversionsToBool, value: true}, {key: readability-implicit-bool-conversion.CheckConversionsFromBool, value: false}]}'
-
-// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t \
-// RUN: -- -config='{CheckOptions: [{key: readability-implicit-bool-conversion.CheckConversionsToBool, value: false}, {key: readability-implicit-bool-conversion.CheckConversionsFromBool, value: false}]}'
// ==========================================================
// Test Case: Conversions to bool (CheckConversionsToBool=true)
>From ed6e001602eaa19510e93038b9df6444eec87fae Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Thu, 19 Dec 2024 18:05:56 +0530
Subject: [PATCH 23/34] Update ReleaseNotes.rst
Fixed by separating options by ',' .
---
clang-tools-extra/docs/ReleaseNotes.rst | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 9c53a770a5edef..8e61635b6c1b08 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -321,14 +321,7 @@ Changes in existing checks
- Improved :doc:`readability-implicit-bool-conversion
<clang-tidy/checks/readability/implicit-bool-conversion>` check by adding the
options:
-
- - `UseUpperCaseLiteralSuffix`: to select the case of the literal suffix in
- fixes and fixing false positive for implicit conversion of comparison
- result in C23.
- - `CheckConversionsToBool`: to allow enabling or disabling warnings for
- implicit conversions to ``bool``.
- - `CheckConversionsFromBool`: to allow enabling or disabling warnings for
- implicit conversions from ``bool``.
+ `UseUpperCaseLiteralSuffix`,`CheckConversionsToBool`,`CheckConversionsFromBool`.
- Improved :doc:`readability-redundant-smartptr-get
<clang-tidy/checks/readability/redundant-smartptr-get>` check to
>From 49008860d2d6d0aa589b2b28b2c852b5fcb9e850 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Thu, 19 Dec 2024 18:08:40 +0530
Subject: [PATCH 24/34] Update ImplicitBoolConversionCheck.cpp
---
.../ImplicitBoolConversionCheck.cpp | 192 +++++++++---------
1 file changed, 95 insertions(+), 97 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index 86939d121a45a7..b3da65758b8bec 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -273,104 +273,102 @@ void ImplicitBoolConversionCheck::storeOptions(
}
void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
- if (CheckConversionFromBool || CheckConversionToBool) {
- auto ExceptionCases =
- expr(anyOf(allOf(isMacroExpansion(), unless(isNULLMacroExpansion())),
- has(ignoringImplicit(
- memberExpr(hasDeclaration(fieldDecl(hasBitWidth(1)))))),
- hasParent(explicitCastExpr()),
- expr(hasType(qualType().bind("type")),
- hasParent(initListExpr(hasParent(explicitCastExpr(
- hasType(qualType(equalsBoundNode("type"))))))))));
-
- auto ImplicitCastFromBool = implicitCastExpr(
- anyOf(hasCastKind(CK_IntegralCast), hasCastKind(CK_IntegralToFloating),
- // Prior to C++11 cast from bool literal to pointer was allowed.
- allOf(anyOf(hasCastKind(CK_NullToPointer),
- hasCastKind(CK_NullToMemberPointer)),
- hasSourceExpression(cxxBoolLiteral()))),
- hasSourceExpression(expr(hasType(booleanType()))));
- auto BoolXor =
- binaryOperator(hasOperatorName("^"), hasLHS(ImplicitCastFromBool),
- hasRHS(ImplicitCastFromBool));
- auto IsInCompilerGeneratedFunction = hasAncestor(namedDecl(anyOf(
- isImplicit(), functionDecl(isDefaulted()), functionTemplateDecl())));
-
- if (CheckConversionToBool) {
- auto ComparisonInCall = allOf(
- hasParent(callExpr()),
- hasSourceExpression(binaryOperator(hasAnyOperatorName("==", "!="))));
-
- Finder->addMatcher(
- traverse(
- TK_AsIs,
- implicitCastExpr(
- anyOf(hasCastKind(CK_IntegralToBoolean),
- hasCastKind(CK_FloatingToBoolean),
- hasCastKind(CK_PointerToBoolean),
- hasCastKind(CK_MemberPointerToBoolean)),
- // Exclude cases of C23 comparison result.
- unless(allOf(isC23(),
- hasSourceExpression(ignoringParens(
- binaryOperator(hasAnyOperatorName(
- ">", ">=", "==", "!=", "<", "<=")))))),
- // Exclude case of using if or while statements with variable
- // declaration, e.g.:
- // if (int var = functionCall()) {}
- unless(hasParent(
- stmt(anyOf(ifStmt(), whileStmt()), has(declStmt())))),
- // Exclude cases common to implicit cast to and from bool.
- unless(ExceptionCases), unless(has(BoolXor)),
- // Exclude C23 cases common to implicit cast to bool.
- unless(ComparisonInCall),
- // Retrieve also parent statement, to check if we need
- // additional parens in replacement.
- optionally(hasParent(stmt().bind("parentStmt"))),
- unless(isInTemplateInstantiation()),
- unless(IsInCompilerGeneratedFunction))
- .bind("implicitCastToBool")),
- this);
- }
-
- if (CheckConversionFromBool) {
-
- auto BoolComparison = binaryOperator(hasAnyOperatorName("==", "!="),
- hasLHS(ImplicitCastFromBool),
- hasRHS(ImplicitCastFromBool));
-
- auto BoolOpAssignment = binaryOperator(
- hasAnyOperatorName("|=", "&="), hasLHS(expr(hasType(booleanType()))));
-
- auto BitfieldAssignment = binaryOperator(
- hasLHS(memberExpr(hasDeclaration(fieldDecl(hasBitWidth(1))))));
-
- auto BitfieldConstruct =
- cxxConstructorDecl(hasDescendant(cxxCtorInitializer(
- withInitializer(equalsBoundNode("implicitCastFromBool")),
- forField(hasBitWidth(1)))));
-
- Finder->addMatcher(
- traverse(TK_AsIs, implicitCastExpr(
- ImplicitCastFromBool, unless(ExceptionCases),
- // Exclude comparisons of bools, as they are
- // always cast to integers in such context:
- // bool_expr_a == bool_expr_b
- // bool_expr_a != bool_expr_b
- unless(hasParent(binaryOperator(anyOf(
- BoolComparison, BoolXor, BoolOpAssignment,
- BitfieldAssignment)))),
- implicitCastExpr().bind("implicitCastFromBool"),
- unless(hasParent(BitfieldConstruct)),
- // Check also for nested casts, for example:
- // bool -> int -> float.
- anyOf(hasParent(implicitCastExpr().bind(
- "furtherImplicitCast")),
- anything()),
- unless(isInTemplateInstantiation()),
- unless(IsInCompilerGeneratedFunction))),
- this);
- }
+ auto ExceptionCases =
+ expr(anyOf(allOf(isMacroExpansion(), unless(isNULLMacroExpansion())),
+ has(ignoringImplicit(
+ memberExpr(hasDeclaration(fieldDecl(hasBitWidth(1)))))),
+ hasParent(explicitCastExpr()),
+ expr(hasType(qualType().bind("type")),
+ hasParent(initListExpr(hasParent(explicitCastExpr(
+ hasType(qualType(equalsBoundNode("type"))))))))));
+
+ auto ImplicitCastFromBool = implicitCastExpr(
+ anyOf(hasCastKind(CK_IntegralCast), hasCastKind(CK_IntegralToFloating),
+ // Prior to C++11 cast from bool literal to pointer was allowed.
+ allOf(anyOf(hasCastKind(CK_NullToPointer),
+ hasCastKind(CK_NullToMemberPointer)),
+ hasSourceExpression(cxxBoolLiteral()))),
+ hasSourceExpression(expr(hasType(booleanType()))));
+ auto BoolXor =
+ binaryOperator(hasOperatorName("^"), hasLHS(ImplicitCastFromBool),
+ hasRHS(ImplicitCastFromBool));
+ auto IsInCompilerGeneratedFunction = hasAncestor(namedDecl(anyOf(
+ isImplicit(), functionDecl(isDefaulted()), functionTemplateDecl())));
+
+ if (CheckConversionToBool) {
+ auto ComparisonInCall = allOf(
+ hasParent(callExpr()),
+ hasSourceExpression(binaryOperator(hasAnyOperatorName("==", "!="))));
+
+ Finder->addMatcher(
+ traverse(
+ TK_AsIs,
+ implicitCastExpr(
+ anyOf(hasCastKind(CK_IntegralToBoolean),
+ hasCastKind(CK_FloatingToBoolean),
+ hasCastKind(CK_PointerToBoolean),
+ hasCastKind(CK_MemberPointerToBoolean)),
+ // Exclude cases of C23 comparison result.
+ unless(allOf(isC23(),
+ hasSourceExpression(ignoringParens(
+ binaryOperator(hasAnyOperatorName(
+ ">", ">=", "==", "!=", "<", "<=")))))),
+ // Exclude case of using if or while statements with variable
+ // declaration, e.g.:
+ // if (int var = functionCall()) {}
+ unless(hasParent(
+ stmt(anyOf(ifStmt(), whileStmt()), has(declStmt())))),
+ // Exclude cases common to implicit cast to and from bool.
+ unless(ExceptionCases), unless(has(BoolXor)),
+ // Exclude C23 cases common to implicit cast to bool.
+ unless(ComparisonInCall),
+ // Retrieve also parent statement, to check if we need
+ // additional parens in replacement.
+ optionally(hasParent(stmt().bind("parentStmt"))),
+ unless(isInTemplateInstantiation()),
+ unless(IsInCompilerGeneratedFunction))
+ .bind("implicitCastToBool")),
+ this);
}
+
+ if (CheckConversionFromBool) {
+
+ auto BoolComparison = binaryOperator(hasAnyOperatorName("==", "!="),
+ hasLHS(ImplicitCastFromBool),
+ hasRHS(ImplicitCastFromBool));
+
+ auto BoolOpAssignment = binaryOperator(
+ hasAnyOperatorName("|=", "&="), hasLHS(expr(hasType(booleanType()))));
+
+ auto BitfieldAssignment = binaryOperator(
+ hasLHS(memberExpr(hasDeclaration(fieldDecl(hasBitWidth(1))))));
+
+ auto BitfieldConstruct =
+ cxxConstructorDecl(hasDescendant(cxxCtorInitializer(
+ withInitializer(equalsBoundNode("implicitCastFromBool")),
+ forField(hasBitWidth(1)))));
+
+ Finder->addMatcher(
+ traverse(TK_AsIs, implicitCastExpr(
+ ImplicitCastFromBool, unless(ExceptionCases),
+ // Exclude comparisons of bools, as they are
+ // always cast to integers in such context:
+ // bool_expr_a == bool_expr_b
+ // bool_expr_a != bool_expr_b
+ unless(hasParent(binaryOperator(anyOf(
+ BoolComparison, BoolXor, BoolOpAssignment,
+ BitfieldAssignment)))),
+ implicitCastExpr().bind("implicitCastFromBool"),
+ unless(hasParent(BitfieldConstruct)),
+ // Check also for nested casts, for example:
+ // bool -> int -> float.
+ anyOf(hasParent(implicitCastExpr().bind(
+ "furtherImplicitCast")),
+ anything()),
+ unless(isInTemplateInstantiation()),
+ unless(IsInCompilerGeneratedFunction))),
+ this);
+ }
}
void ImplicitBoolConversionCheck::check(
>From e1eaf3019d697dc9377add668a4cf81135d335e2 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Thu, 19 Dec 2024 22:31:45 +0530
Subject: [PATCH 25/34] Update ReleaseNotes.rst
---
clang-tools-extra/docs/ReleaseNotes.rst | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 8e61635b6c1b08..38f968d48cd7e1 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -320,8 +320,8 @@ Changes in existing checks
- Improved :doc:`readability-implicit-bool-conversion
<clang-tidy/checks/readability/implicit-bool-conversion>` check by adding the
- options:
- `UseUpperCaseLiteralSuffix`,`CheckConversionsToBool`,`CheckConversionsFromBool`.
+ options: `UseUpperCaseLiteralSuffix`,`CheckConversionsToBool`,
+ `CheckConversionsFromBool`.
- Improved :doc:`readability-redundant-smartptr-get
<clang-tidy/checks/readability/redundant-smartptr-get>` check to
>From 899683c1e771fc2d9e4c1293d167399b561a0847 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Fri, 20 Dec 2024 07:52:31 +0530
Subject: [PATCH 26/34] Update ImplicitBoolConversionCheck.cpp
Fixed Bugs regarding wrong variable names.
---
.../readability/ImplicitBoolConversionCheck.cpp | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index b3da65758b8bec..804c8068bc868c 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -260,16 +260,16 @@ ImplicitBoolConversionCheck::ImplicitBoolConversionCheck(
AllowPointerConditions(Options.get("AllowPointerConditions", false)),
UseUpperCaseLiteralSuffix(
Options.get("UseUpperCaseLiteralSuffix", false)),
- CheckConversionsToBool(Options.get("CheckConversionsToBool", true)),
- CheckConversionsFromBool(Options.get("CheckConversionsFromBool", true)) {}
+ CheckConversionToBool(Options.get("CheckConversionToBool", true)),
+ CheckConversionFromBool(Options.get("CheckConversionFromBool", true)) {}
void ImplicitBoolConversionCheck::storeOptions(
ClangTidyOptions::OptionMap &Opts) {
Options.store(Opts, "AllowIntegerConditions", AllowIntegerConditions);
Options.store(Opts, "AllowPointerConditions", AllowPointerConditions);
Options.store(Opts, "UseUpperCaseLiteralSuffix", UseUpperCaseLiteralSuffix);
- Options.store(Opts, "CheckConversionsToBool", CheckConversionsToBool);
- Options.store(Opts, "CheckConversionsFromBool", CheckConversionsFromBool);
+ Options.store(Opts, "CheckConversionToBool", CheckConversionToBool);
+ Options.store(Opts, "CheckConversionFromBool", CheckConversionFromBool);
}
void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
>From 414768eeaafdd2a52b11811536430f0d2f0c2eec Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Fri, 20 Dec 2024 08:01:09 +0530
Subject: [PATCH 27/34] Update ImplicitBoolConversionCheck.cpp
Fixed Bugs regarding mismatched named variables.
---
.../readability/ImplicitBoolConversionCheck.cpp | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index 804c8068bc868c..6c5456ef60e612 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -260,16 +260,16 @@ ImplicitBoolConversionCheck::ImplicitBoolConversionCheck(
AllowPointerConditions(Options.get("AllowPointerConditions", false)),
UseUpperCaseLiteralSuffix(
Options.get("UseUpperCaseLiteralSuffix", false)),
- CheckConversionToBool(Options.get("CheckConversionToBool", true)),
- CheckConversionFromBool(Options.get("CheckConversionFromBool", true)) {}
+ CheckConversionsToBool(Options.get("CheckConversionsToBool", true)),
+ CheckConversionsFromBool(Options.get("CheckConversionsFromBool", true)) {}
void ImplicitBoolConversionCheck::storeOptions(
ClangTidyOptions::OptionMap &Opts) {
Options.store(Opts, "AllowIntegerConditions", AllowIntegerConditions);
Options.store(Opts, "AllowPointerConditions", AllowPointerConditions);
Options.store(Opts, "UseUpperCaseLiteralSuffix", UseUpperCaseLiteralSuffix);
- Options.store(Opts, "CheckConversionToBool", CheckConversionToBool);
- Options.store(Opts, "CheckConversionFromBool", CheckConversionFromBool);
+ Options.store(Opts, "CheckConversionsToBool", CheckConversionsToBool);
+ Options.store(Opts, "CheckConversionsFromBool", CheckConversionsFromBool);
}
void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
@@ -295,7 +295,7 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
auto IsInCompilerGeneratedFunction = hasAncestor(namedDecl(anyOf(
isImplicit(), functionDecl(isDefaulted()), functionTemplateDecl())));
- if (CheckConversionToBool) {
+ if (CheckConversionsToBool) {
auto ComparisonInCall = allOf(
hasParent(callExpr()),
hasSourceExpression(binaryOperator(hasAnyOperatorName("==", "!="))));
@@ -331,7 +331,7 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
this);
}
- if (CheckConversionFromBool) {
+ if (CheckConversionsFromBool) {
auto BoolComparison = binaryOperator(hasAnyOperatorName("==", "!="),
hasLHS(ImplicitCastFromBool),
>From 565bef8efd8cab1f4019f39c0cb590f5f5656531 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Fri, 20 Dec 2024 08:16:33 +0530
Subject: [PATCH 28/34] Update ReleaseNotes.rst
Improved Readibility and Description.
---
clang-tools-extra/docs/ReleaseNotes.rst | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 38f968d48cd7e1..2c0d57985c2aaf 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -320,8 +320,10 @@ Changes in existing checks
- Improved :doc:`readability-implicit-bool-conversion
<clang-tidy/checks/readability/implicit-bool-conversion>` check by adding the
- options: `UseUpperCaseLiteralSuffix`,`CheckConversionsToBool`,
- `CheckConversionsFromBool`.
+ option `UseUpperCaseLiteralSuffix` to select the case of the literal suffix in
+ fixes and fixing false positive for implicit conversion of comparison result in
+ C23 , and by adding the option `CheckConversionsToBool` or
+ `CheckConversionsFromBool` to configure checks for conversions involving ``bool``.
- Improved :doc:`readability-redundant-smartptr-get
<clang-tidy/checks/readability/redundant-smartptr-get>` check to
>From dac44f43cc87f5f18ad44db70ccbeee512a3c3fe Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Sat, 21 Dec 2024 00:36:26 +0530
Subject: [PATCH 29/34] Update implicit-bool-conversion-check.cpp
Fixed Bugs related to check-suffix.
---
.../implicit-bool-conversion-check.cpp | 36 +++++++++----------
1 file changed, 18 insertions(+), 18 deletions(-)
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
index a01658b9cbf00a..70aba3db4091d0 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
@@ -1,18 +1,18 @@
// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t -- -- -std=c23
-// RUN: %check_clang_tidy -check-suffix=TO-BOOL-FALSE %s readability-implicit-bool-conversion %t -- \
+// RUN: %check_clang_tidy -check-suffix=TO-BOOL %s readability-implicit-bool-conversion %t -- \
// RUN: -config='{CheckOptions: { \
-// RUN: readability-implicit-bool-conversion.CheckConversionsToBool: false, \
+// RUN: readability-implicit-bool-conversion.CheckConversionsToBool: true, \
// RUN: readability-implicit-bool-conversion.CheckConversionsFromBool: true \
// RUN: }}' -- -std=c23
-// RUN: %check_clang_tidy -check-suffix=FROM-BOOL-FALSE %s readability-implicit-bool-conversion %t -- \
+// RUN: %check_clang_tidy -check-suffix=FROM-BOOL %s readability-implicit-bool-conversion %t -- \
// RUN: -config='{CheckOptions: { \
// RUN: readability-implicit-bool-conversion.CheckConversionsToBool: true, \
-// RUN: readability-implicit-bool-conversion.CheckConversionsFromBool: false \
+// RUN: readability-implicit-bool-conversion.CheckConversionsFromBool: true \
// RUN: }}' -- -std=c23
-// RUN: %check_clang_tidy -check-suffix=TO-AND-FROM-BOOL-FALSE %s readability-implicit-bool-conversion %t -- \
+// RUN: %check_clang_tidy -check-suffix=TO-BOOL,FROM-BOOL %s readability-implicit-bool-conversion %t -- \
// RUN: -config='{CheckOptions: { \
-// RUN: readability-implicit-bool-conversion.CheckConversionsToBool: false, \
-// RUN: readability-implicit-bool-conversion.CheckConversionsFromBool: false \
+// RUN: readability-implicit-bool-conversion.CheckConversionsToBool: true, \
+// RUN: readability-implicit-bool-conversion.CheckConversionsFromBool: true \
// RUN: }}' -- -std=c23
@@ -21,15 +21,15 @@
// ==========================================================
void TestConversionsToBool() {
int x = 42;
- if (x) // CHECK-MESSAGES: :[[@LINE]]:8: warning: implicit conversion 'int' -> 'bool'
+ if (x) // CHECK-MESSAGES-TO-BOOL: :[[@LINE]]:8: warning: implicit conversion 'int' -> 'bool'
(void)0;
float f = 3.14;
- if (f) // CHECK-MESSAGES: :[[@LINE]]:8: warning: implicit conversion 'float' -> 'bool'
+ if (f) // CHECK-MESSAGES-TO-BOOL: :[[@LINE]]:8: warning: implicit conversion 'float' -> 'bool'
(void)0;
int *p = nullptr;
- if (p) // CHECK-MESSAGES: :[[@LINE]]:8: warning: implicit conversion 'int *' -> 'bool'
+ if (p) // CHECK-MESSAGES-TO-BOOL: :[[@LINE]]:8: warning: implicit conversion 'int *' -> 'bool'
(void)0;
// Pointer-to-member
@@ -37,7 +37,7 @@ void TestConversionsToBool() {
int member;
};
int S::*ptr = nullptr;
- if (ptr) // CHECK-MESSAGES: :[[@LINE]]:8: warning: implicit conversion 'int S::*' -> 'bool'
+ if (ptr) // CHECK-MESSAGES-TO-BOOL: :[[@LINE]]:8: warning: implicit conversion 'int S::*' -> 'bool'
(void)0;
}
@@ -47,20 +47,20 @@ void TestConversionsToBool() {
void TestConversionsFromBool() {
bool b = true;
- int x = b; // CHECK-MESSAGES: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int'
- float f = b; // CHECK-MESSAGES: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'float'
+ int x = b; // CHECK-MESSAGES-FROM-BOOL: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int'
+ float f = b; // CHECK-MESSAGES-FROM-BOOL: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'float'
}
// ==========================================================
-// Test Case: Mixed Configurations (ToBool=false, FromBool=true)
+// Test Case: Mixed Configurations (ToBool=true, FromBool=true)
// ==========================================================
void TestMixedConfig() {
int x = 42;
- if (x) // No warning: CheckConversionsToBool=false
+ if (x) // CHECK-MESSAGES-TO-BOOL: :[[@LINE]]:8: warning: implicit conversion 'int' -> 'bool'
(void)0;
bool b = true;
- int y = b; // CHECK-MESSAGES: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int'
+ int y = b; // CHECK-MESSAGES-FROM-BOOL: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int'
}
// ==========================================================
@@ -82,11 +82,11 @@ void TestEdgeCases() {
bool b = true;
// Nested implicit casts
- int x = (b ? 1 : 0); // CHECK-MESSAGES: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int'
+ int x = (b ? 1 : 0); // CHECK-MESSAGES-FROM-BOOL: :[[@LINE]]:13: warning: implicit conversion 'bool' -> 'int'
// Function returns implicit bool
auto ReturnBool = []() -> bool { return true; };
- int y = ReturnBool(); // CHECK-MESSAGES: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int'
+ int y = ReturnBool(); // CHECK-MESSAGES-FROM-BOOL: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int'
// Explicit casts (no diagnostics)
int z = static_cast<int>(b); // No warning: explicit cast
>From fd1f7dc2290eb6b766ed48769214e2cf5246c247 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Sat, 21 Dec 2024 01:10:13 +0530
Subject: [PATCH 30/34] [Test]Update implicit-bool-conversion-check.cpp
Just for testing purpose of BuildKite.
---
.../readability/implicit-bool-conversion-check.cpp | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
index 70aba3db4091d0..931c3ec30041dc 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
@@ -67,12 +67,12 @@ void TestMixedConfig() {
// Test Case: No Diagnostics (ToBool=false, FromBool=false)
// ==========================================================
void TestNoDiagnostics() {
- int x = 42;
- if (x) // No warning: CheckConversionsToBool=false
- (void)0;
+ // int x = 42;
+ // if (x) // No warning: CheckConversionsToBool=false
+ // (void)0;
- bool b = true;
- int y = b; // No warning: CheckConversionsFromBool=false
+ // bool b = true;
+ // int y = b; // No warning: CheckConversionsFromBool=false
}
// ==========================================================
@@ -88,6 +88,6 @@ void TestEdgeCases() {
auto ReturnBool = []() -> bool { return true; };
int y = ReturnBool(); // CHECK-MESSAGES-FROM-BOOL: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int'
- // Explicit casts (no diagnostics)
- int z = static_cast<int>(b); // No warning: explicit cast
+ // // Explicit casts (no diagnostics)
+ // int z = static_cast<int>(b); // No warning: explicit cast
}
>From df5e48e5a4064aab2d233052390bdc16900a664e Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Sun, 22 Dec 2024 10:55:28 +0530
Subject: [PATCH 31/34] Update implicit-bool-conversion-check.cpp
Wrote basic level tests. (Similar to the tests in other check files).
---
.../implicit-bool-conversion-check.cpp | 93 ++-----------------
1 file changed, 8 insertions(+), 85 deletions(-)
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
index 931c3ec30041dc..7121035b2c2983 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
@@ -1,93 +1,16 @@
-// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t -- -- -std=c23
-// RUN: %check_clang_tidy -check-suffix=TO-BOOL %s readability-implicit-bool-conversion %t -- \
+// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t -- \
// RUN: -config='{CheckOptions: { \
// RUN: readability-implicit-bool-conversion.CheckConversionsToBool: true, \
// RUN: readability-implicit-bool-conversion.CheckConversionsFromBool: true \
// RUN: }}' -- -std=c23
-// RUN: %check_clang_tidy -check-suffix=FROM-BOOL %s readability-implicit-bool-conversion %t -- \
-// RUN: -config='{CheckOptions: { \
-// RUN: readability-implicit-bool-conversion.CheckConversionsToBool: true, \
-// RUN: readability-implicit-bool-conversion.CheckConversionsFromBool: true \
-// RUN: }}' -- -std=c23
-// RUN: %check_clang_tidy -check-suffix=TO-BOOL,FROM-BOOL %s readability-implicit-bool-conversion %t -- \
-// RUN: -config='{CheckOptions: { \
-// RUN: readability-implicit-bool-conversion.CheckConversionsToBool: true, \
-// RUN: readability-implicit-bool-conversion.CheckConversionsFromBool: true \
-// RUN: }}' -- -std=c23
-
-
-// ==========================================================
-// Test Case: Conversions to bool (CheckConversionsToBool=true)
-// ==========================================================
-void TestConversionsToBool() {
- int x = 42;
- if (x) // CHECK-MESSAGES-TO-BOOL: :[[@LINE]]:8: warning: implicit conversion 'int' -> 'bool'
- (void)0;
-
- float f = 3.14;
- if (f) // CHECK-MESSAGES-TO-BOOL: :[[@LINE]]:8: warning: implicit conversion 'float' -> 'bool'
- (void)0;
-
- int *p = nullptr;
- if (p) // CHECK-MESSAGES-TO-BOOL: :[[@LINE]]:8: warning: implicit conversion 'int *' -> 'bool'
- (void)0;
- // Pointer-to-member
- struct S {
- int member;
- };
- int S::*ptr = nullptr;
- if (ptr) // CHECK-MESSAGES-TO-BOOL: :[[@LINE]]:8: warning: implicit conversion 'int S::*' -> 'bool'
+void TestImplicitBoolConversion() {
+ int intValue = 10;
+ if (intValue) // CHECK-MESSAGES: :[[@LINE]]:7: warning: implicit conversion 'int' -> 'bool' [readability-implicit-bool-conversion]
+ // CHECK-FIXES: if (intValue != 0)
(void)0;
-}
-
-// ==========================================================
-// Test Case: Conversions from bool (CheckConversionsFromBool=true)
-// ==========================================================
-void TestConversionsFromBool() {
- bool b = true;
-
- int x = b; // CHECK-MESSAGES-FROM-BOOL: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int'
- float f = b; // CHECK-MESSAGES-FROM-BOOL: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'float'
-}
-
-// ==========================================================
-// Test Case: Mixed Configurations (ToBool=true, FromBool=true)
-// ==========================================================
-void TestMixedConfig() {
- int x = 42;
- if (x) // CHECK-MESSAGES-TO-BOOL: :[[@LINE]]:8: warning: implicit conversion 'int' -> 'bool'
- (void)0;
-
- bool b = true;
- int y = b; // CHECK-MESSAGES-FROM-BOOL: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int'
-}
-
-// ==========================================================
-// Test Case: No Diagnostics (ToBool=false, FromBool=false)
-// ==========================================================
-void TestNoDiagnostics() {
- // int x = 42;
- // if (x) // No warning: CheckConversionsToBool=false
- // (void)0;
-
- // bool b = true;
- // int y = b; // No warning: CheckConversionsFromBool=false
-}
-
-// ==========================================================
-// Test Case: Edge Cases and Complex Expressions
-// ==========================================================
-void TestEdgeCases() {
- bool b = true;
-
- // Nested implicit casts
- int x = (b ? 1 : 0); // CHECK-MESSAGES-FROM-BOOL: :[[@LINE]]:13: warning: implicit conversion 'bool' -> 'int'
-
- // Function returns implicit bool
- auto ReturnBool = []() -> bool { return true; };
- int y = ReturnBool(); // CHECK-MESSAGES-FROM-BOOL: :[[@LINE]]:12: warning: implicit conversion 'bool' -> 'int'
- // // Explicit casts (no diagnostics)
- // int z = static_cast<int>(b); // No warning: explicit cast
+ bool boolValue = true;
+ int newIntValue = boolValue; // CHECK-MESSAGES: :[[@LINE]]:21: warning: implicit conversion 'bool' -> 'int' [readability-implicit-bool-conversion]
+ // CHECK-FIXES: int newIntValue = static_cast<int>(boolValue);
}
>From 56a4e091e8d7bfb36ff46fc07f2486016eaecd7f Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Sun, 22 Dec 2024 23:36:45 +0530
Subject: [PATCH 32/34] Update implicit-bool-conversion-check.cpp
Updated for all permutations of configurations options and also for the more comprehensive tests.
---
.../implicit-bool-conversion-check.cpp | 57 ++++++++++++++++---
1 file changed, 49 insertions(+), 8 deletions(-)
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
index 7121035b2c2983..8ba4635de1704f 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion-check.cpp
@@ -1,16 +1,57 @@
-// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t -- \
+// RUN: %check_clang_tidy -check-suffix=FROM %s readability-implicit-bool-conversion %t -- \
+// RUN: -config='{CheckOptions: { \
+// RUN: readability-implicit-bool-conversion.CheckConversionsToBool: false, \
+// RUN: readability-implicit-bool-conversion.CheckConversionsFromBool: true \
+// RUN: }}' -- -std=c23
+// RUN: %check_clang_tidy -check-suffix=TO %s readability-implicit-bool-conversion %t -- \
+// RUN: -config='{CheckOptions: { \
+// RUN: readability-implicit-bool-conversion.CheckConversionsToBool: true, \
+// RUN: readability-implicit-bool-conversion.CheckConversionsFromBool: false \
+// RUN: }}' -- -std=c23
+// RUN: %check_clang_tidy -check-suffix=NORMAL %s readability-implicit-bool-conversion %t -- \
+// RUN: -config='{CheckOptions: { \
+// RUN: readability-implicit-bool-conversion.CheckConversionsToBool: false, \
+// RUN: readability-implicit-bool-conversion.CheckConversionsFromBool: false \
+// RUN: }}' -- -std=c23
+// RUN: %check_clang_tidy -check-suffix=TO,FROM %s readability-implicit-bool-conversion %t -- \
// RUN: -config='{CheckOptions: { \
// RUN: readability-implicit-bool-conversion.CheckConversionsToBool: true, \
// RUN: readability-implicit-bool-conversion.CheckConversionsFromBool: true \
// RUN: }}' -- -std=c23
+// Test various implicit bool conversions in different contexts
void TestImplicitBoolConversion() {
- int intValue = 10;
- if (intValue) // CHECK-MESSAGES: :[[@LINE]]:7: warning: implicit conversion 'int' -> 'bool' [readability-implicit-bool-conversion]
- // CHECK-FIXES: if (intValue != 0)
- (void)0;
+ // Basic type conversions to bool
+ int intValue = 42;
+ if (intValue) // CHECK-MESSAGES-TO: :[[@LINE]]:9: warning: implicit conversion 'int' -> 'bool' [readability-implicit-bool-conversion]
+ // CHECK-FIXES-TO: if (intValue != 0)
+ (void)0;
+
+ float floatValue = 3.14f;
+ while (floatValue) // CHECK-MESSAGES-TO: :[[@LINE]]:12: warning: implicit conversion 'float' -> 'bool' [readability-implicit-bool-conversion]
+ // CHECK-FIXES-TO: while (floatValue != 0.0f)
+ break;
+
+ char charValue = 'a';
+ do {
+ break;
+ } while (charValue); // CHECK-MESSAGES-TO: :[[@LINE]]:14: warning: implicit conversion 'char' -> 'bool' [readability-implicit-bool-conversion]
+ // CHECK-FIXES-TO: } while (charValue != 0);
+
+ // Pointer conversions to bool
+ int* ptrValue = &intValue;
+ if (ptrValue) // CHECK-MESSAGES-TO: :[[@LINE]]:9: warning: implicit conversion 'int *' -> 'bool' [readability-implicit-bool-conversion]
+ // CHECK-FIXES-TO: if (ptrValue != nullptr)
+ (void)0;
+
+ // Conversions from bool to other types
+ bool boolValue = true;
+ int intFromBool = boolValue; // CHECK-MESSAGES-FROM: :[[@LINE]]:23: warning: implicit conversion 'bool' -> 'int' [readability-implicit-bool-conversion]
+ // CHECK-FIXES-FROM: int intFromBool = static_cast<int>(boolValue);
+
+ float floatFromBool = boolValue; // CHECK-MESSAGES-FROM: :[[@LINE]]:27: warning: implicit conversion 'bool' -> 'float' [readability-implicit-bool-conversion]
+ // CHECK-FIXES-FROM: float floatFromBool = static_cast<float>(boolValue);
- bool boolValue = true;
- int newIntValue = boolValue; // CHECK-MESSAGES: :[[@LINE]]:21: warning: implicit conversion 'bool' -> 'int' [readability-implicit-bool-conversion]
- // CHECK-FIXES: int newIntValue = static_cast<int>(boolValue);
+ char charFromBool = boolValue; // CHECK-MESSAGES-FROM: :[[@LINE]]:25: warning: implicit conversion 'bool' -> 'char' [readability-implicit-bool-conversion]
+ // CHECK-FIXES-FROM: char charFromBool = static_cast<char>(boolValue);
}
>From 75fe805c9e2b45632e2653b3e3a1b7874ede2507 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Mon, 23 Dec 2024 08:51:27 +0530
Subject: [PATCH 33/34] Update ReleaseNotes.rst
---
clang-tools-extra/docs/ReleaseNotes.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 2c0d57985c2aaf..7f2f22ecb84330 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -322,7 +322,7 @@ Changes in existing checks
<clang-tidy/checks/readability/implicit-bool-conversion>` check by adding the
option `UseUpperCaseLiteralSuffix` to select the case of the literal suffix in
fixes and fixing false positive for implicit conversion of comparison result in
- C23 , and by adding the option `CheckConversionsToBool` or
+ C23, and by adding the option `CheckConversionsToBool` or
`CheckConversionsFromBool` to configure checks for conversions involving ``bool``.
- Improved :doc:`readability-redundant-smartptr-get
>From dff9123605de05f13f5f895bf98798b56132b1d1 Mon Sep 17 00:00:00 2001
From: 4m4n-x-B4w4ne <125849251+4m4n-x-B4w4ne at users.noreply.github.com>
Date: Sat, 28 Dec 2024 09:10:39 +0530
Subject: [PATCH 34/34] Update ImplicitBoolConversionCheck.cpp
FIxed Clang formatting issue.
---
.../ImplicitBoolConversionCheck.cpp | 39 ++++++++++---------
1 file changed, 20 insertions(+), 19 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index 6c5456ef60e612..48851da143068f 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -349,26 +349,27 @@ void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
forField(hasBitWidth(1)))));
Finder->addMatcher(
- traverse(TK_AsIs, implicitCastExpr(
- ImplicitCastFromBool, unless(ExceptionCases),
- // Exclude comparisons of bools, as they are
- // always cast to integers in such context:
- // bool_expr_a == bool_expr_b
- // bool_expr_a != bool_expr_b
- unless(hasParent(binaryOperator(anyOf(
- BoolComparison, BoolXor, BoolOpAssignment,
- BitfieldAssignment)))),
- implicitCastExpr().bind("implicitCastFromBool"),
- unless(hasParent(BitfieldConstruct)),
- // Check also for nested casts, for example:
- // bool -> int -> float.
- anyOf(hasParent(implicitCastExpr().bind(
- "furtherImplicitCast")),
- anything()),
- unless(isInTemplateInstantiation()),
- unless(IsInCompilerGeneratedFunction))),
+ traverse(
+ TK_AsIs,
+ implicitCastExpr(
+ ImplicitCastFromBool, unless(ExceptionCases),
+ // Exclude comparisons of bools, as they are
+ // always cast to integers in such context:
+ // bool_expr_a == bool_expr_b
+ // bool_expr_a != bool_expr_b
+ unless(hasParent(binaryOperator(anyOf(BoolComparison, BoolXor,
+ BoolOpAssignment,
+ BitfieldAssignment)))),
+ implicitCastExpr().bind("implicitCastFromBool"),
+ unless(hasParent(BitfieldConstruct)),
+ // Check also for nested casts, for example:
+ // bool -> int -> float.
+ anyOf(hasParent(implicitCastExpr().bind("furtherImplicitCast")),
+ anything()),
+ unless(isInTemplateInstantiation()),
+ unless(IsInCompilerGeneratedFunction))),
this);
- }
+ }
}
void ImplicitBoolConversionCheck::check(
More information about the cfe-commits
mailing list