[clang-tools-extra] [clang-tidy] use upper case letters for bool conversion suffix (PR #102831)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 16 12:46:00 PDT 2024
https://github.com/Da-Viper updated https://github.com/llvm/llvm-project/pull/102831
>From 8a4f6af9fc1f44c2f8b5fd3693ca14eaf776fd02 Mon Sep 17 00:00:00 2001
From: Ebuka Ezike <yerimyah1 at gmail.com>
Date: Sun, 11 Aug 2024 21:39:35 +0100
Subject: [PATCH 01/11] [clang-tidy] use upper cace letters for bool conversion
suffix
When readability-implicit-bool-conversion-check and readability-uppercase-literal-suffix-check is enabled this will cause you to apply a fix twice
from (!i) -> (i == 0u) to (i == 0U) twice instead will skip the middle one
---
.../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 aa115cd450c4f6..258cec80dd0bac 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -43,10 +43,10 @@ StringRef getZeroLiteralToCompareWithForType(CastKind CastExprKind,
ASTContext &Context) {
switch (CastExprKind) {
case CK_IntegralToBoolean:
- return Type->isUnsignedIntegerType() ? "0u" : "0";
+ return Type->isUnsignedIntegerType() ? "0U" : "0";
case CK_FloatingToBoolean:
- return Context.hasSameType(Type, Context.FloatTy) ? "0.0f" : "0.0";
+ return Context.hasSameType(Type, Context.FloatTy) ? "0.0F" : "0.0";
case CK_PointerToBoolean:
case CK_MemberPointerToBoolean: // Fall-through on purpose.
@@ -202,13 +202,13 @@ StringRef getEquivalentForBoolLiteral(const CXXBoolLiteralExpr *BoolLiteral,
if (DestType->isFloatingType()) {
if (Context.hasSameType(DestType, Context.FloatTy)) {
- return BoolLiteral->getValue() ? "1.0f" : "0.0f";
+ return BoolLiteral->getValue() ? "1.0F" : "0.0F";
}
return BoolLiteral->getValue() ? "1.0" : "0.0";
}
if (DestType->isUnsignedIntegerType()) {
- return BoolLiteral->getValue() ? "1u" : "0u";
+ return BoolLiteral->getValue() ? "1U" : "0U";
}
return BoolLiteral->getValue() ? "1" : "0";
}
>From efb102b86e6ba2d05141040faf31eaaff5886f18 Mon Sep 17 00:00:00 2001
From: Ebuka Ezike <yerimyah1 at gmail.com>
Date: Tue, 13 Aug 2024 00:49:41 +0100
Subject: [PATCH 02/11] Update test cases
---
.../readability/implicit-bool-conversion.c | 14 +++++-----
.../readability/implicit-bool-conversion.cpp | 28 +++++++++----------
2 files changed, 21 insertions(+), 21 deletions(-)
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c
index a8c69858f76b61..29869b100894f4 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c
@@ -94,7 +94,7 @@ void implicitConversionFromBoolLiterals() {
functionTakingUnsignedLong(false);
// CHECK-MESSAGES: :[[@LINE-1]]:30: warning: implicit conversion 'bool' -> 'unsigned long'
- // CHECK-FIXES: functionTakingUnsignedLong(0u);
+ // CHECK-FIXES: functionTakingUnsignedLong(0U);
functionTakingSignedChar(true);
// CHECK-MESSAGES: :[[@LINE-1]]:28: warning: implicit conversion 'bool' -> 'signed char'
@@ -102,7 +102,7 @@ void implicitConversionFromBoolLiterals() {
functionTakingFloat(false);
// CHECK-MESSAGES: :[[@LINE-1]]:23: warning: implicit conversion 'bool' -> 'float'
- // CHECK-FIXES: functionTakingFloat(0.0f);
+ // CHECK-FIXES: functionTakingFloat(0.0F);
functionTakingDouble(true);
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'bool' -> 'double'
@@ -159,12 +159,12 @@ void implicitConversionToBoolSimpleCases() {
unsigned long unsignedLong = 10;
functionTakingBool(unsignedLong);
// CHECK-MESSAGES: :[[@LINE-1]]:22: warning: implicit conversion 'unsigned long' -> 'bool'
- // CHECK-FIXES: functionTakingBool(unsignedLong != 0u);
+ // CHECK-FIXES: functionTakingBool(unsignedLong != 0U);
float floating = 0.0f;
functionTakingBool(floating);
// CHECK-MESSAGES: :[[@LINE-1]]:22: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: functionTakingBool(floating != 0.0f);
+ // CHECK-FIXES: functionTakingBool(floating != 0.0F);
double doubleFloating = 1.0f;
functionTakingBool(doubleFloating);
@@ -193,7 +193,7 @@ void implicitConversionToBoolInSingleExpressions() {
bool boolComingFromFloat;
boolComingFromFloat = floating;
// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: boolComingFromFloat = (floating != 0.0f);
+ // CHECK-FIXES: boolComingFromFloat = (floating != 0.0F);
signed char character = 'a';
bool boolComingFromChar;
@@ -231,7 +231,7 @@ bool implicitConversionToBoolInReturnValue() {
float floating = 1.0f;
return floating;
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: return floating != 0.0f;
+ // CHECK-FIXES: return floating != 0.0F;
}
void implicitConversionToBoolFromLiterals() {
@@ -287,7 +287,7 @@ void implicitConversionToBoolFromUnaryMinusAndZeroLiterals() {
functionTakingBool(-0.0f);
// CHECK-MESSAGES: :[[@LINE-1]]:22: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: functionTakingBool((-0.0f) != 0.0f);
+ // CHECK-FIXES: functionTakingBool((-0.0f) != 0.0F);
functionTakingBool(-0.0);
// CHECK-MESSAGES: :[[@LINE-1]]:22: warning: implicit conversion 'double' -> 'bool'
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp
index d6e7dcc4d8867b..f3c4481a7cc430 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp
@@ -98,7 +98,7 @@ void implicitConversionFromBoolLiterals() {
functionTaking<unsigned long>(false);
// CHECK-MESSAGES: :[[@LINE-1]]:33: warning: implicit conversion 'bool' -> 'unsigned long'
- // CHECK-FIXES: functionTaking<unsigned long>(0u);
+ // CHECK-FIXES: functionTaking<unsigned long>(0U);
functionTaking<signed char>(true);
// CHECK-MESSAGES: :[[@LINE-1]]:31: warning: implicit conversion 'bool' -> 'signed char'
@@ -106,7 +106,7 @@ void implicitConversionFromBoolLiterals() {
functionTaking<float>(false);
// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: implicit conversion 'bool' -> 'float'
- // CHECK-FIXES: functionTaking<float>(0.0f);
+ // CHECK-FIXES: functionTaking<float>(0.0F);
functionTaking<double>(true);
// CHECK-MESSAGES: :[[@LINE-1]]:26: warning: implicit conversion 'bool' -> 'double'
@@ -177,14 +177,14 @@ void implicitConversionToBoolSimpleCases() {
unsigned long unsignedLong = 10;
functionTaking<bool>(unsignedLong);
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'unsigned long' -> 'bool'
- // CHECK-FIXES: functionTaking<bool>(unsignedLong != 0u);
+ // CHECK-FIXES: functionTaking<bool>(unsignedLong != 0U);
- float floating = 0.0f;
+ float floating = 0.0F;
functionTaking<bool>(floating);
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: functionTaking<bool>(floating != 0.0f);
+ // CHECK-FIXES: functionTaking<bool>(floating != 0.0F);
- double doubleFloating = 1.0f;
+ double doubleFloating = 1.0F;
functionTaking<bool>(doubleFloating);
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'double' -> 'bool'
// CHECK-FIXES: functionTaking<bool>(doubleFloating != 0.0);
@@ -211,10 +211,10 @@ void implicitConversionToBoolInSingleExpressions() {
// CHECK-MESSAGES: :[[@LINE-1]]:28: warning: implicit conversion 'int' -> 'bool'
// CHECK-FIXES: bool boolComingFromInt = integer != 0;
- float floating = 10.0f;
+ float floating = 10.0F;
bool boolComingFromFloat = floating;
// CHECK-MESSAGES: :[[@LINE-1]]:30: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: bool boolComingFromFloat = floating != 0.0f;
+ // CHECK-FIXES: bool boolComingFromFloat = floating != 0.0F;
signed char character = 'a';
bool boolComingFromChar = character;
@@ -239,7 +239,7 @@ void implicitConversionToBoolInComplexExpressions() {
float floating = 0.2f;
bool boolComingFromFloating = floating - 0.3f || boolean;
// CHECK-MESSAGES: :[[@LINE-1]]:33: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: bool boolComingFromFloating = ((floating - 0.3f) != 0.0f) || boolean;
+ // CHECK-FIXES: bool boolComingFromFloating = ((floating - 0.3f) != 0.0F) || boolean;
double doubleFloating = 0.3;
bool boolComingFromDoubleFloating = (doubleFloating - 0.4) && boolean;
@@ -253,10 +253,10 @@ void implicitConversionInNegationExpressions() {
// CHECK-MESSAGES: :[[@LINE-1]]:36: warning: implicit conversion 'int' -> 'bool'
// CHECK-FIXES: bool boolComingFromNegatedInt = integer == 0;
- float floating = 10.0f;
+ float floating = 10.0F;
bool boolComingFromNegatedFloat = ! floating;
// CHECK-MESSAGES: :[[@LINE-1]]:39: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: bool boolComingFromNegatedFloat = floating == 0.0f;
+ // CHECK-FIXES: bool boolComingFromNegatedFloat = floating == 0.0F;
signed char character = 'a';
bool boolComingFromNegatedChar = (! character);
@@ -283,7 +283,7 @@ void implicitConversionToBoolInControlStatements() {
float floating = 0.3f;
while (floating) {}
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: while (floating != 0.0f) {}
+ // CHECK-FIXES: while (floating != 0.0F) {}
double doubleFloating = 0.4;
do {} while (doubleFloating);
@@ -295,7 +295,7 @@ bool implicitConversionToBoolInReturnValue() {
float floating = 1.0f;
return floating;
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: return floating != 0.0f;
+ // CHECK-FIXES: return floating != 0.0F;
}
void implicitConversionToBoolFromLiterals() {
@@ -354,7 +354,7 @@ void implicitConversionToBoolFromUnaryMinusAndZeroLiterals() {
functionTaking<bool>(-0.0f);
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: functionTaking<bool>((-0.0f) != 0.0f);
+ // CHECK-FIXES: functionTaking<bool>((-0.0f) != 0.0F);
functionTaking<bool>(-0.0);
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'double' -> 'bool'
>From 19cba070d37c55fca1d1c872ffdb8fb0dfa9e281 Mon Sep 17 00:00:00 2001
From: Ebuka Ezike <yerimyah1 at gmail.com>
Date: Tue, 13 Aug 2024 20:31:55 +0100
Subject: [PATCH 03/11] Revert "Update test cases"
This reverts commit efb102b86e6ba2d05141040faf31eaaff5886f18.
---
.../readability/implicit-bool-conversion.c | 14 +++++-----
.../readability/implicit-bool-conversion.cpp | 28 +++++++++----------
2 files changed, 21 insertions(+), 21 deletions(-)
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c
index 29869b100894f4..a8c69858f76b61 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c
@@ -94,7 +94,7 @@ void implicitConversionFromBoolLiterals() {
functionTakingUnsignedLong(false);
// CHECK-MESSAGES: :[[@LINE-1]]:30: warning: implicit conversion 'bool' -> 'unsigned long'
- // CHECK-FIXES: functionTakingUnsignedLong(0U);
+ // CHECK-FIXES: functionTakingUnsignedLong(0u);
functionTakingSignedChar(true);
// CHECK-MESSAGES: :[[@LINE-1]]:28: warning: implicit conversion 'bool' -> 'signed char'
@@ -102,7 +102,7 @@ void implicitConversionFromBoolLiterals() {
functionTakingFloat(false);
// CHECK-MESSAGES: :[[@LINE-1]]:23: warning: implicit conversion 'bool' -> 'float'
- // CHECK-FIXES: functionTakingFloat(0.0F);
+ // CHECK-FIXES: functionTakingFloat(0.0f);
functionTakingDouble(true);
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'bool' -> 'double'
@@ -159,12 +159,12 @@ void implicitConversionToBoolSimpleCases() {
unsigned long unsignedLong = 10;
functionTakingBool(unsignedLong);
// CHECK-MESSAGES: :[[@LINE-1]]:22: warning: implicit conversion 'unsigned long' -> 'bool'
- // CHECK-FIXES: functionTakingBool(unsignedLong != 0U);
+ // CHECK-FIXES: functionTakingBool(unsignedLong != 0u);
float floating = 0.0f;
functionTakingBool(floating);
// CHECK-MESSAGES: :[[@LINE-1]]:22: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: functionTakingBool(floating != 0.0F);
+ // CHECK-FIXES: functionTakingBool(floating != 0.0f);
double doubleFloating = 1.0f;
functionTakingBool(doubleFloating);
@@ -193,7 +193,7 @@ void implicitConversionToBoolInSingleExpressions() {
bool boolComingFromFloat;
boolComingFromFloat = floating;
// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: boolComingFromFloat = (floating != 0.0F);
+ // CHECK-FIXES: boolComingFromFloat = (floating != 0.0f);
signed char character = 'a';
bool boolComingFromChar;
@@ -231,7 +231,7 @@ bool implicitConversionToBoolInReturnValue() {
float floating = 1.0f;
return floating;
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: return floating != 0.0F;
+ // CHECK-FIXES: return floating != 0.0f;
}
void implicitConversionToBoolFromLiterals() {
@@ -287,7 +287,7 @@ void implicitConversionToBoolFromUnaryMinusAndZeroLiterals() {
functionTakingBool(-0.0f);
// CHECK-MESSAGES: :[[@LINE-1]]:22: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: functionTakingBool((-0.0f) != 0.0F);
+ // CHECK-FIXES: functionTakingBool((-0.0f) != 0.0f);
functionTakingBool(-0.0);
// CHECK-MESSAGES: :[[@LINE-1]]:22: warning: implicit conversion 'double' -> 'bool'
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp
index f3c4481a7cc430..d6e7dcc4d8867b 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp
@@ -98,7 +98,7 @@ void implicitConversionFromBoolLiterals() {
functionTaking<unsigned long>(false);
// CHECK-MESSAGES: :[[@LINE-1]]:33: warning: implicit conversion 'bool' -> 'unsigned long'
- // CHECK-FIXES: functionTaking<unsigned long>(0U);
+ // CHECK-FIXES: functionTaking<unsigned long>(0u);
functionTaking<signed char>(true);
// CHECK-MESSAGES: :[[@LINE-1]]:31: warning: implicit conversion 'bool' -> 'signed char'
@@ -106,7 +106,7 @@ void implicitConversionFromBoolLiterals() {
functionTaking<float>(false);
// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: implicit conversion 'bool' -> 'float'
- // CHECK-FIXES: functionTaking<float>(0.0F);
+ // CHECK-FIXES: functionTaking<float>(0.0f);
functionTaking<double>(true);
// CHECK-MESSAGES: :[[@LINE-1]]:26: warning: implicit conversion 'bool' -> 'double'
@@ -177,14 +177,14 @@ void implicitConversionToBoolSimpleCases() {
unsigned long unsignedLong = 10;
functionTaking<bool>(unsignedLong);
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'unsigned long' -> 'bool'
- // CHECK-FIXES: functionTaking<bool>(unsignedLong != 0U);
+ // CHECK-FIXES: functionTaking<bool>(unsignedLong != 0u);
- float floating = 0.0F;
+ float floating = 0.0f;
functionTaking<bool>(floating);
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: functionTaking<bool>(floating != 0.0F);
+ // CHECK-FIXES: functionTaking<bool>(floating != 0.0f);
- double doubleFloating = 1.0F;
+ double doubleFloating = 1.0f;
functionTaking<bool>(doubleFloating);
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'double' -> 'bool'
// CHECK-FIXES: functionTaking<bool>(doubleFloating != 0.0);
@@ -211,10 +211,10 @@ void implicitConversionToBoolInSingleExpressions() {
// CHECK-MESSAGES: :[[@LINE-1]]:28: warning: implicit conversion 'int' -> 'bool'
// CHECK-FIXES: bool boolComingFromInt = integer != 0;
- float floating = 10.0F;
+ float floating = 10.0f;
bool boolComingFromFloat = floating;
// CHECK-MESSAGES: :[[@LINE-1]]:30: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: bool boolComingFromFloat = floating != 0.0F;
+ // CHECK-FIXES: bool boolComingFromFloat = floating != 0.0f;
signed char character = 'a';
bool boolComingFromChar = character;
@@ -239,7 +239,7 @@ void implicitConversionToBoolInComplexExpressions() {
float floating = 0.2f;
bool boolComingFromFloating = floating - 0.3f || boolean;
// CHECK-MESSAGES: :[[@LINE-1]]:33: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: bool boolComingFromFloating = ((floating - 0.3f) != 0.0F) || boolean;
+ // CHECK-FIXES: bool boolComingFromFloating = ((floating - 0.3f) != 0.0f) || boolean;
double doubleFloating = 0.3;
bool boolComingFromDoubleFloating = (doubleFloating - 0.4) && boolean;
@@ -253,10 +253,10 @@ void implicitConversionInNegationExpressions() {
// CHECK-MESSAGES: :[[@LINE-1]]:36: warning: implicit conversion 'int' -> 'bool'
// CHECK-FIXES: bool boolComingFromNegatedInt = integer == 0;
- float floating = 10.0F;
+ float floating = 10.0f;
bool boolComingFromNegatedFloat = ! floating;
// CHECK-MESSAGES: :[[@LINE-1]]:39: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: bool boolComingFromNegatedFloat = floating == 0.0F;
+ // CHECK-FIXES: bool boolComingFromNegatedFloat = floating == 0.0f;
signed char character = 'a';
bool boolComingFromNegatedChar = (! character);
@@ -283,7 +283,7 @@ void implicitConversionToBoolInControlStatements() {
float floating = 0.3f;
while (floating) {}
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: while (floating != 0.0F) {}
+ // CHECK-FIXES: while (floating != 0.0f) {}
double doubleFloating = 0.4;
do {} while (doubleFloating);
@@ -295,7 +295,7 @@ bool implicitConversionToBoolInReturnValue() {
float floating = 1.0f;
return floating;
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: return floating != 0.0F;
+ // CHECK-FIXES: return floating != 0.0f;
}
void implicitConversionToBoolFromLiterals() {
@@ -354,7 +354,7 @@ void implicitConversionToBoolFromUnaryMinusAndZeroLiterals() {
functionTaking<bool>(-0.0f);
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'float' -> 'bool'
- // CHECK-FIXES: functionTaking<bool>((-0.0f) != 0.0F);
+ // CHECK-FIXES: functionTaking<bool>((-0.0f) != 0.0f);
functionTaking<bool>(-0.0);
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'double' -> 'bool'
>From e38a7ad0c315bfc93c36a370642b1837466c6f44 Mon Sep 17 00:00:00 2001
From: Ebuka Ezike <yerimyah1 at gmail.com>
Date: Tue, 13 Aug 2024 21:39:49 +0100
Subject: [PATCH 04/11] Add option `UseUpperCaseSuffix` to
implicit-bool-conversion check
---
.../ImplicitBoolConversionCheck.cpp | 46 +++++++++++++------
.../readability/ImplicitBoolConversionCheck.h | 1 +
2 files changed, 33 insertions(+), 14 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index 258cec80dd0bac..883d16a3325e5c 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -39,14 +39,22 @@ AST_MATCHER(Stmt, isNULLMacroExpansion) {
}
StringRef getZeroLiteralToCompareWithForType(CastKind CastExprKind,
- QualType Type,
- ASTContext &Context) {
+ QualType Type, ASTContext &Context,
+ bool UseUpperCaseSuffix) {
switch (CastExprKind) {
- case CK_IntegralToBoolean:
- return Type->isUnsignedIntegerType() ? "0U" : "0";
+ case CK_IntegralToBoolean: {
+ if (Type->isUnsignedIntegerType()) {
+ return UseUpperCaseSuffix ? "0U" : "0u";
+ }
+ return "0";
+ }
- case CK_FloatingToBoolean:
- return Context.hasSameType(Type, Context.FloatTy) ? "0.0F" : "0.0";
+ case CK_FloatingToBoolean: {
+ if (Context.hasSameType(Type, Context.FloatTy)) {
+ return UseUpperCaseSuffix ? "0.0F" : "0.0f";
+ }
+ return "0.0";
+ }
case CK_PointerToBoolean:
case CK_MemberPointerToBoolean: // Fall-through on purpose.
@@ -66,7 +74,7 @@ bool isUnaryLogicalNotOperator(const Stmt *Statement) {
void fixGenericExprCastToBool(DiagnosticBuilder &Diag,
const ImplicitCastExpr *Cast, const Stmt *Parent,
- ASTContext &Context) {
+ ASTContext &Context, bool UseUpperCaseSuffix) {
// In case of expressions like (! integer), we should remove the redundant not
// operator and use inverted comparison (integer == 0).
bool InvertComparison =
@@ -113,7 +121,7 @@ void fixGenericExprCastToBool(DiagnosticBuilder &Diag,
}
EndLocInsertion += getZeroLiteralToCompareWithForType(
- Cast->getCastKind(), SubExpr->getType(), Context);
+ Cast->getCastKind(), SubExpr->getType(), Context, UseUpperCaseSuffix);
if (NeedOuterParens) {
EndLocInsertion += ")";
@@ -192,7 +200,8 @@ void fixGenericExprCastFromBool(DiagnosticBuilder &Diag,
}
StringRef getEquivalentForBoolLiteral(const CXXBoolLiteralExpr *BoolLiteral,
- QualType DestType, ASTContext &Context) {
+ QualType DestType, ASTContext &Context,
+ bool UseUpperCaseSuffix) {
// Prior to C++11, false literal could be implicitly converted to pointer.
if (!Context.getLangOpts().CPlusPlus11 &&
(DestType->isPointerType() || DestType->isMemberPointerType()) &&
@@ -202,13 +211,19 @@ StringRef getEquivalentForBoolLiteral(const CXXBoolLiteralExpr *BoolLiteral,
if (DestType->isFloatingType()) {
if (Context.hasSameType(DestType, Context.FloatTy)) {
- return BoolLiteral->getValue() ? "1.0F" : "0.0F";
+ if (BoolLiteral->getValue()) {
+ return UseUpperCaseSuffix ? "1.0F" : "1.0f";
+ }
+ return UseUpperCaseSuffix ? "0.0F" : "0.0f";
}
return BoolLiteral->getValue() ? "1.0" : "0.0";
}
if (DestType->isUnsignedIntegerType()) {
- return BoolLiteral->getValue() ? "1U" : "0U";
+ if (BoolLiteral->getValue()) {
+ return UseUpperCaseSuffix ? "1U" : "1u";
+ }
+ return UseUpperCaseSuffix ? "0U" : "0u";
}
return BoolLiteral->getValue() ? "1" : "0";
}
@@ -248,12 +263,14 @@ ImplicitBoolConversionCheck::ImplicitBoolConversionCheck(
StringRef Name, ClangTidyContext *Context)
: ClangTidyCheck(Name, Context),
AllowIntegerConditions(Options.get("AllowIntegerConditions", false)),
- AllowPointerConditions(Options.get("AllowPointerConditions", false)) {}
+ AllowPointerConditions(Options.get("AllowPointerConditions", false)),
+ UseUpperCaseSuffix(Options.get("UseUpperCaseSuffix", false)) {}
void ImplicitBoolConversionCheck::storeOptions(
ClangTidyOptions::OptionMap &Opts) {
Options.store(Opts, "AllowIntegerConditions", AllowIntegerConditions);
Options.store(Opts, "AllowPointerConditions", AllowPointerConditions);
+ Options.store(Opts, "UseUpperCaseSuffix", UseUpperCaseSuffix);
}
void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
@@ -378,7 +395,7 @@ void ImplicitBoolConversionCheck::handleCastToBool(const ImplicitCastExpr *Cast,
if (!EquivalentLiteral.empty()) {
Diag << tooling::fixit::createReplacement(*Cast, EquivalentLiteral);
} else {
- fixGenericExprCastToBool(Diag, Cast, Parent, Context);
+ fixGenericExprCastToBool(Diag, Cast, Parent, Context, UseUpperCaseSuffix);
}
}
@@ -393,7 +410,8 @@ void ImplicitBoolConversionCheck::handleCastFromBool(
if (const auto *BoolLiteral =
dyn_cast<CXXBoolLiteralExpr>(Cast->getSubExpr()->IgnoreParens())) {
Diag << tooling::fixit::createReplacement(
- *Cast, getEquivalentForBoolLiteral(BoolLiteral, DestType, Context));
+ *Cast, getEquivalentForBoolLiteral(BoolLiteral, DestType, Context,
+ UseUpperCaseSuffix));
} else {
fixGenericExprCastFromBool(Diag, Cast, Context, DestType.getAsString());
}
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
index 9defec91e2f78d..a07d5c16c49946 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
@@ -36,6 +36,7 @@ class ImplicitBoolConversionCheck : public ClangTidyCheck {
const bool AllowIntegerConditions;
const bool AllowPointerConditions;
+ const bool UseUpperCaseSuffix;
};
} // namespace clang::tidy::readability
>From d8568e42e8a38ffdd45601c23bb00301a5ec7551 Mon Sep 17 00:00:00 2001
From: Ebuka Ezike <yerimyah1 at gmail.com>
Date: Tue, 13 Aug 2024 21:40:16 +0100
Subject: [PATCH 05/11] Update test cases to test the new `UpperCaseSuffix`
option
---
.../readability/implicit-bool-conversion.c | 10 ++++++++++
.../readability/implicit-bool-conversion.cpp | 14 ++++++++++++++
2 files changed, 24 insertions(+)
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c
index a8c69858f76b61..a058eb88e514b6 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c
@@ -1,4 +1,8 @@
// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t -- -- -std=c23
+// RUN: %check_clang_tidy -check-suffix=UPPER-CASE %s readability-implicit-bool-conversion %t -- \
+// RUN: -config='{CheckOptions: { \
+// RUN: readability-implicit-bool-conversion.UseUpperCaseSuffix: true \
+// RUN: }}' -- -std=c23
#undef NULL
#define NULL 0L
@@ -95,6 +99,7 @@ void implicitConversionFromBoolLiterals() {
functionTakingUnsignedLong(false);
// CHECK-MESSAGES: :[[@LINE-1]]:30: warning: implicit conversion 'bool' -> 'unsigned long'
// CHECK-FIXES: functionTakingUnsignedLong(0u);
+ // CHECK-FIXES-UPPER-CASE: functionTakingUnsignedLong(0U);
functionTakingSignedChar(true);
// CHECK-MESSAGES: :[[@LINE-1]]:28: warning: implicit conversion 'bool' -> 'signed char'
@@ -103,6 +108,7 @@ void implicitConversionFromBoolLiterals() {
functionTakingFloat(false);
// CHECK-MESSAGES: :[[@LINE-1]]:23: warning: implicit conversion 'bool' -> 'float'
// CHECK-FIXES: functionTakingFloat(0.0f);
+ // CHECK-FIXES-UPPER-CASE: functionTakingFloat(0.0F);
functionTakingDouble(true);
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'bool' -> 'double'
@@ -160,11 +166,13 @@ void implicitConversionToBoolSimpleCases() {
functionTakingBool(unsignedLong);
// CHECK-MESSAGES: :[[@LINE-1]]:22: warning: implicit conversion 'unsigned long' -> 'bool'
// CHECK-FIXES: functionTakingBool(unsignedLong != 0u);
+ // CHECK-FIXES-UPPER-CASE: functionTakingBool(unsignedLong != 0U);
float floating = 0.0f;
functionTakingBool(floating);
// CHECK-MESSAGES: :[[@LINE-1]]:22: warning: implicit conversion 'float' -> 'bool'
// CHECK-FIXES: functionTakingBool(floating != 0.0f);
+ // CHECK-FIXES-UPPER-CASE: functionTakingBool(floating != 0.0F);
double doubleFloating = 1.0f;
functionTakingBool(doubleFloating);
@@ -194,6 +202,7 @@ void implicitConversionToBoolInSingleExpressions() {
boolComingFromFloat = floating;
// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: implicit conversion 'float' -> 'bool'
// CHECK-FIXES: boolComingFromFloat = (floating != 0.0f);
+ // CHECK-FIXES-UPPER-CASE: boolComingFromFloat = (floating != 0.0F);
signed char character = 'a';
bool boolComingFromChar;
@@ -288,6 +297,7 @@ void implicitConversionToBoolFromUnaryMinusAndZeroLiterals() {
functionTakingBool(-0.0f);
// CHECK-MESSAGES: :[[@LINE-1]]:22: warning: implicit conversion 'float' -> 'bool'
// CHECK-FIXES: functionTakingBool((-0.0f) != 0.0f);
+ // CHECK-FIXES-UPPER-CASE: functionTakingBool((-0.0f) != 0.0F);
functionTakingBool(-0.0);
// CHECK-MESSAGES: :[[@LINE-1]]:22: warning: implicit conversion 'double' -> 'bool'
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp
index d6e7dcc4d8867b..f24f1c99907caf 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp
@@ -1,4 +1,8 @@
// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t
+// RUN: %check_clang_tidy -check-suffix=UPPER-CASE %s readability-implicit-bool-conversion %t -- \
+// RUN: -config='{CheckOptions: { \
+// RUN: readability-implicit-bool-conversion.UseUpperCaseSuffix: true \
+// RUN: }}'
// We need NULL macro, but some buildbots don't like including <cstddef> header
// This is a portable way of getting it to work
@@ -99,6 +103,7 @@ void implicitConversionFromBoolLiterals() {
functionTaking<unsigned long>(false);
// CHECK-MESSAGES: :[[@LINE-1]]:33: warning: implicit conversion 'bool' -> 'unsigned long'
// CHECK-FIXES: functionTaking<unsigned long>(0u);
+ // CHECK-FIXES-UPPER-CASE: functionTaking<unsigned long>(0U);
functionTaking<signed char>(true);
// CHECK-MESSAGES: :[[@LINE-1]]:31: warning: implicit conversion 'bool' -> 'signed char'
@@ -107,6 +112,7 @@ void implicitConversionFromBoolLiterals() {
functionTaking<float>(false);
// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: implicit conversion 'bool' -> 'float'
// CHECK-FIXES: functionTaking<float>(0.0f);
+ // CHECK-FIXES-UPPER-CASE: functionTaking<float>(0.0F);
functionTaking<double>(true);
// CHECK-MESSAGES: :[[@LINE-1]]:26: warning: implicit conversion 'bool' -> 'double'
@@ -178,11 +184,13 @@ void implicitConversionToBoolSimpleCases() {
functionTaking<bool>(unsignedLong);
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'unsigned long' -> 'bool'
// CHECK-FIXES: functionTaking<bool>(unsignedLong != 0u);
+ // CHECK-FIXES-UPPER-CASE: functionTaking<bool>(unsignedLong != 0U);
float floating = 0.0f;
functionTaking<bool>(floating);
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'float' -> 'bool'
// CHECK-FIXES: functionTaking<bool>(floating != 0.0f);
+ // CHECK-FIXES-UPPER-CASE: functionTaking<bool>(floating != 0.0F);
double doubleFloating = 1.0f;
functionTaking<bool>(doubleFloating);
@@ -215,6 +223,7 @@ void implicitConversionToBoolInSingleExpressions() {
bool boolComingFromFloat = floating;
// CHECK-MESSAGES: :[[@LINE-1]]:30: warning: implicit conversion 'float' -> 'bool'
// CHECK-FIXES: bool boolComingFromFloat = floating != 0.0f;
+ // CHECK-FIXES-UPPER-CASE: bool boolComingFromFloat = floating != 0.0F;
signed char character = 'a';
bool boolComingFromChar = character;
@@ -240,6 +249,7 @@ void implicitConversionToBoolInComplexExpressions() {
bool boolComingFromFloating = floating - 0.3f || boolean;
// CHECK-MESSAGES: :[[@LINE-1]]:33: warning: implicit conversion 'float' -> 'bool'
// CHECK-FIXES: bool boolComingFromFloating = ((floating - 0.3f) != 0.0f) || boolean;
+ // CHECK-FIXES-UPPER-CASE: bool boolComingFromFloating = ((floating - 0.3f) != 0.0F) || boolean;
double doubleFloating = 0.3;
bool boolComingFromDoubleFloating = (doubleFloating - 0.4) && boolean;
@@ -257,6 +267,7 @@ void implicitConversionInNegationExpressions() {
bool boolComingFromNegatedFloat = ! floating;
// CHECK-MESSAGES: :[[@LINE-1]]:39: warning: implicit conversion 'float' -> 'bool'
// CHECK-FIXES: bool boolComingFromNegatedFloat = floating == 0.0f;
+ // CHECK-FIXES-UPPER-CASE: bool boolComingFromNegatedFloat = floating == 0.0F;
signed char character = 'a';
bool boolComingFromNegatedChar = (! character);
@@ -284,6 +295,7 @@ void implicitConversionToBoolInControlStatements() {
while (floating) {}
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: implicit conversion 'float' -> 'bool'
// CHECK-FIXES: while (floating != 0.0f) {}
+ // CHECK-FIXES-UPPER-CASE: while (floating != 0.0F) {}
double doubleFloating = 0.4;
do {} while (doubleFloating);
@@ -296,6 +308,7 @@ bool implicitConversionToBoolInReturnValue() {
return floating;
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: implicit conversion 'float' -> 'bool'
// CHECK-FIXES: return floating != 0.0f;
+ // CHECK-FIXES-UPPER-CASE: return floating != 0.0F;
}
void implicitConversionToBoolFromLiterals() {
@@ -355,6 +368,7 @@ void implicitConversionToBoolFromUnaryMinusAndZeroLiterals() {
functionTaking<bool>(-0.0f);
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'float' -> 'bool'
// CHECK-FIXES: functionTaking<bool>((-0.0f) != 0.0f);
+ // CHECK-FIXES-UPPER-CASE: functionTaking<bool>((-0.0f) != 0.0F);
functionTaking<bool>(-0.0);
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: implicit conversion 'double' -> 'bool'
>From b06fb9a09609b766102f863409559a67f357987a Mon Sep 17 00:00:00 2001
From: Ebuka Ezike <yerimyah1 at gmail.com>
Date: Tue, 13 Aug 2024 21:47:24 +0100
Subject: [PATCH 06/11] Update ReleaseNotes.rst with the new
`UseUpperCaseSuffix` option
---
clang-tools-extra/docs/ReleaseNotes.rst | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index b72d109b3d3938..d5002bd81a7b5c 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -108,6 +108,10 @@ Changes in existing checks
<clang-tidy/checks/readability/redundant-smartptr-get>` check to
remove `->`, when reduntant `get()` is removed.
+- Added option `UseUpperCaseSuffix` to :doc:`readablility-implicit-bool-conversion
+ <clang-tidy/checks/readability/implicit-bool-conversion>` check specify the
+ case of the explicit literal
+
Removed checks
^^^^^^^^^^^^^^
>From b6d0537d339071fb91b7359d0c6609810e30c623 Mon Sep 17 00:00:00 2001
From: Ebuka Ezike <yerimyah1 at gmail.com>
Date: Tue, 13 Aug 2024 21:57:26 +0100
Subject: [PATCH 07/11] Update Documentation with the new `UseUpperCaseSuffix`
option
---
.../readability/implicit-bool-conversion.rst | 15 +++++++++++++++
1 file changed, 15 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 1ab21ffeb42289..2afd890d5cd3b3 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
@@ -133,3 +133,18 @@ Options
When `true`, the check will allow conditional pointer conversions. Default
is `false`.
+
+.. option:: UseUpperCaseSuffix
+
+ When `true`, the check will allow new explicit conversion use an uppercase
+ suffix when it applies.
+
+Example
+^^^^^^^
+
+.. code-block:: c++
+
+ uint32_t foo;
+ if (foo) {}
+ // ^ propose replacement default: if (foo != 0u) {}
+ // ^ propose replacement with option `UseUpperCaseSuffix`: if (foo != 0U) {}
>From 27d059c86418c16ccafd77e0fa5e3cb2ef9906ff Mon Sep 17 00:00:00 2001
From: Ebuka Ezike <yerimyah1 at gmail.com>
Date: Thu, 15 Aug 2024 00:52:40 +0100
Subject: [PATCH 08/11] Resolve review changes
---
.../readability/ImplicitBoolConversionCheck.cpp | 12 ++++++------
clang-tools-extra/docs/ReleaseNotes.rst | 4 ++--
.../checks/readability/implicit-bool-conversion.rst | 4 ++--
3 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index 883d16a3325e5c..16d626e5995f7f 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -43,9 +43,9 @@ StringRef getZeroLiteralToCompareWithForType(CastKind CastExprKind,
bool UseUpperCaseSuffix) {
switch (CastExprKind) {
case CK_IntegralToBoolean: {
- if (Type->isUnsignedIntegerType()) {
+ if (Type->isUnsignedIntegerType())
return UseUpperCaseSuffix ? "0U" : "0u";
- }
+
return "0";
}
@@ -211,18 +211,18 @@ StringRef getEquivalentForBoolLiteral(const CXXBoolLiteralExpr *BoolLiteral,
if (DestType->isFloatingType()) {
if (Context.hasSameType(DestType, Context.FloatTy)) {
- if (BoolLiteral->getValue()) {
+ if (BoolLiteral->getValue())
return UseUpperCaseSuffix ? "1.0F" : "1.0f";
- }
+
return UseUpperCaseSuffix ? "0.0F" : "0.0f";
}
return BoolLiteral->getValue() ? "1.0" : "0.0";
}
if (DestType->isUnsignedIntegerType()) {
- if (BoolLiteral->getValue()) {
+ if (BoolLiteral->getValue())
return UseUpperCaseSuffix ? "1U" : "1u";
- }
+
return UseUpperCaseSuffix ? "0U" : "0u";
}
return BoolLiteral->getValue() ? "1" : "0";
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index d5002bd81a7b5c..27669fb22fb750 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -109,8 +109,8 @@ Changes in existing checks
remove `->`, when reduntant `get()` is removed.
- Added option `UseUpperCaseSuffix` to :doc:`readablility-implicit-bool-conversion
- <clang-tidy/checks/readability/implicit-bool-conversion>` check specify the
- case of the explicit literal
+ <clang-tidy/checks/readability/implicit-bool-conversion>` check to select the
+ case of the literal suffix in fixes.
Removed checks
^^^^^^^^^^^^^^
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 2afd890d5cd3b3..e54c418c3636f6 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
@@ -136,8 +136,8 @@ Options
.. option:: UseUpperCaseSuffix
- When `true`, the check will allow new explicit conversion use an uppercase
- suffix when it applies.
+ When `true`, the replacements will use an uppercase literal suffix in the
+ provided fixes.
Example
^^^^^^^
>From 214e252a23fe6473aa21ccfbf8d098e1dbac5eb0 Mon Sep 17 00:00:00 2001
From: Ebuka Ezike <yerimyah1 at gmail.com>
Date: Thu, 15 Aug 2024 01:19:43 +0100
Subject: [PATCH 09/11] Change the option name to `UseUpperCaseLiteralSuffix`
---
.../ImplicitBoolConversionCheck.cpp | 28 +++++++++----------
.../readability/ImplicitBoolConversionCheck.h | 2 +-
clang-tools-extra/docs/ReleaseNotes.rst | 2 +-
.../readability/implicit-bool-conversion.rst | 4 +--
.../readability/implicit-bool-conversion.c | 2 +-
.../readability/implicit-bool-conversion.cpp | 2 +-
6 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index 16d626e5995f7f..7ac5ec0b2fdcea 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -40,18 +40,18 @@ AST_MATCHER(Stmt, isNULLMacroExpansion) {
StringRef getZeroLiteralToCompareWithForType(CastKind CastExprKind,
QualType Type, ASTContext &Context,
- bool UseUpperCaseSuffix) {
+ bool UseUpperCaseLiteralSuffix) {
switch (CastExprKind) {
case CK_IntegralToBoolean: {
if (Type->isUnsignedIntegerType())
- return UseUpperCaseSuffix ? "0U" : "0u";
+ return UseUpperCaseLiteralSuffix ? "0U" : "0u";
return "0";
}
case CK_FloatingToBoolean: {
if (Context.hasSameType(Type, Context.FloatTy)) {
- return UseUpperCaseSuffix ? "0.0F" : "0.0f";
+ return UseUpperCaseLiteralSuffix ? "0.0F" : "0.0f";
}
return "0.0";
}
@@ -74,7 +74,7 @@ bool isUnaryLogicalNotOperator(const Stmt *Statement) {
void fixGenericExprCastToBool(DiagnosticBuilder &Diag,
const ImplicitCastExpr *Cast, const Stmt *Parent,
- ASTContext &Context, bool UseUpperCaseSuffix) {
+ ASTContext &Context, bool UseUpperCaseLiteralSuffix) {
// In case of expressions like (! integer), we should remove the redundant not
// operator and use inverted comparison (integer == 0).
bool InvertComparison =
@@ -121,7 +121,7 @@ void fixGenericExprCastToBool(DiagnosticBuilder &Diag,
}
EndLocInsertion += getZeroLiteralToCompareWithForType(
- Cast->getCastKind(), SubExpr->getType(), Context, UseUpperCaseSuffix);
+ Cast->getCastKind(), SubExpr->getType(), Context, UseUpperCaseLiteralSuffix);
if (NeedOuterParens) {
EndLocInsertion += ")";
@@ -201,7 +201,7 @@ void fixGenericExprCastFromBool(DiagnosticBuilder &Diag,
StringRef getEquivalentForBoolLiteral(const CXXBoolLiteralExpr *BoolLiteral,
QualType DestType, ASTContext &Context,
- bool UseUpperCaseSuffix) {
+ bool UseUpperCaseLiteralSuffix) {
// Prior to C++11, false literal could be implicitly converted to pointer.
if (!Context.getLangOpts().CPlusPlus11 &&
(DestType->isPointerType() || DestType->isMemberPointerType()) &&
@@ -212,18 +212,18 @@ StringRef getEquivalentForBoolLiteral(const CXXBoolLiteralExpr *BoolLiteral,
if (DestType->isFloatingType()) {
if (Context.hasSameType(DestType, Context.FloatTy)) {
if (BoolLiteral->getValue())
- return UseUpperCaseSuffix ? "1.0F" : "1.0f";
+ return UseUpperCaseLiteralSuffix ? "1.0F" : "1.0f";
- return UseUpperCaseSuffix ? "0.0F" : "0.0f";
+ return UseUpperCaseLiteralSuffix ? "0.0F" : "0.0f";
}
return BoolLiteral->getValue() ? "1.0" : "0.0";
}
if (DestType->isUnsignedIntegerType()) {
if (BoolLiteral->getValue())
- return UseUpperCaseSuffix ? "1U" : "1u";
+ return UseUpperCaseLiteralSuffix ? "1U" : "1u";
- return UseUpperCaseSuffix ? "0U" : "0u";
+ return UseUpperCaseLiteralSuffix ? "0U" : "0u";
}
return BoolLiteral->getValue() ? "1" : "0";
}
@@ -264,13 +264,13 @@ ImplicitBoolConversionCheck::ImplicitBoolConversionCheck(
: ClangTidyCheck(Name, Context),
AllowIntegerConditions(Options.get("AllowIntegerConditions", false)),
AllowPointerConditions(Options.get("AllowPointerConditions", false)),
- UseUpperCaseSuffix(Options.get("UseUpperCaseSuffix", false)) {}
+ UseUpperCaseLiteralSuffix(Options.get("UseUpperCaseLiteralSuffix", false)) {}
void ImplicitBoolConversionCheck::storeOptions(
ClangTidyOptions::OptionMap &Opts) {
Options.store(Opts, "AllowIntegerConditions", AllowIntegerConditions);
Options.store(Opts, "AllowPointerConditions", AllowPointerConditions);
- Options.store(Opts, "UseUpperCaseSuffix", UseUpperCaseSuffix);
+ Options.store(Opts, "UseUpperCaseLiteralSuffix", UseUpperCaseLiteralSuffix);
}
void ImplicitBoolConversionCheck::registerMatchers(MatchFinder *Finder) {
@@ -395,7 +395,7 @@ void ImplicitBoolConversionCheck::handleCastToBool(const ImplicitCastExpr *Cast,
if (!EquivalentLiteral.empty()) {
Diag << tooling::fixit::createReplacement(*Cast, EquivalentLiteral);
} else {
- fixGenericExprCastToBool(Diag, Cast, Parent, Context, UseUpperCaseSuffix);
+ fixGenericExprCastToBool(Diag, Cast, Parent, Context, UseUpperCaseLiteralSuffix);
}
}
@@ -411,7 +411,7 @@ void ImplicitBoolConversionCheck::handleCastFromBool(
dyn_cast<CXXBoolLiteralExpr>(Cast->getSubExpr()->IgnoreParens())) {
Diag << tooling::fixit::createReplacement(
*Cast, getEquivalentForBoolLiteral(BoolLiteral, DestType, Context,
- UseUpperCaseSuffix));
+ UseUpperCaseLiteralSuffix));
} else {
fixGenericExprCastFromBool(Diag, Cast, Context, DestType.getAsString());
}
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
index a07d5c16c49946..5947f7316e67cc 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.h
@@ -36,7 +36,7 @@ class ImplicitBoolConversionCheck : public ClangTidyCheck {
const bool AllowIntegerConditions;
const bool AllowPointerConditions;
- const bool UseUpperCaseSuffix;
+ const bool UseUpperCaseLiteralSuffix;
};
} // namespace clang::tidy::readability
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 27669fb22fb750..123c7ec4ab7ae0 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -108,7 +108,7 @@ Changes in existing checks
<clang-tidy/checks/readability/redundant-smartptr-get>` check to
remove `->`, when reduntant `get()` is removed.
-- Added option `UseUpperCaseSuffix` to :doc:`readablility-implicit-bool-conversion
+- Added option `UseUpperCaseLiteralSuffix` to :doc:`readablility-implicit-bool-conversion
<clang-tidy/checks/readability/implicit-bool-conversion>` check to select the
case of the literal suffix in fixes.
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 e54c418c3636f6..4d6b83d304fcd0 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
@@ -134,7 +134,7 @@ Options
When `true`, the check will allow conditional pointer conversions. Default
is `false`.
-.. option:: UseUpperCaseSuffix
+.. option:: UseUpperCaseLiteralSuffix
When `true`, the replacements will use an uppercase literal suffix in the
provided fixes.
@@ -147,4 +147,4 @@ Example
uint32_t foo;
if (foo) {}
// ^ propose replacement default: if (foo != 0u) {}
- // ^ propose replacement with option `UseUpperCaseSuffix`: if (foo != 0U) {}
+ // ^ propose replacement with option `UseUpperCaseLiteralSuffix`: if (foo != 0U) {}
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c
index a058eb88e514b6..f3dc32c10d640a 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.c
@@ -1,7 +1,7 @@
// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t -- -- -std=c23
// RUN: %check_clang_tidy -check-suffix=UPPER-CASE %s readability-implicit-bool-conversion %t -- \
// RUN: -config='{CheckOptions: { \
-// RUN: readability-implicit-bool-conversion.UseUpperCaseSuffix: true \
+// RUN: readability-implicit-bool-conversion.UseUpperCaseLiteralSuffix: true \
// RUN: }}' -- -std=c23
#undef NULL
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp
index f24f1c99907caf..c4b7a77b92f0a5 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/implicit-bool-conversion.cpp
@@ -1,7 +1,7 @@
// RUN: %check_clang_tidy %s readability-implicit-bool-conversion %t
// RUN: %check_clang_tidy -check-suffix=UPPER-CASE %s readability-implicit-bool-conversion %t -- \
// RUN: -config='{CheckOptions: { \
-// RUN: readability-implicit-bool-conversion.UseUpperCaseSuffix: true \
+// RUN: readability-implicit-bool-conversion.UseUpperCaseLiteralSuffix: true \
// RUN: }}'
// We need NULL macro, but some buildbots don't like including <cstddef> header
>From 44189b9a2f41c5898c6526589071508f8639056d Mon Sep 17 00:00:00 2001
From: Ebuka Ezike <yerimyah1 at gmail.com>
Date: Thu, 15 Aug 2024 01:37:53 +0100
Subject: [PATCH 10/11] Fix Clang format
---
.../readability/ImplicitBoolConversionCheck.cpp | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index 7ac5ec0b2fdcea..825455e822bfc5 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -74,7 +74,8 @@ bool isUnaryLogicalNotOperator(const Stmt *Statement) {
void fixGenericExprCastToBool(DiagnosticBuilder &Diag,
const ImplicitCastExpr *Cast, const Stmt *Parent,
- ASTContext &Context, bool UseUpperCaseLiteralSuffix) {
+ ASTContext &Context,
+ bool UseUpperCaseLiteralSuffix) {
// In case of expressions like (! integer), we should remove the redundant not
// operator and use inverted comparison (integer == 0).
bool InvertComparison =
@@ -121,7 +122,8 @@ void fixGenericExprCastToBool(DiagnosticBuilder &Diag,
}
EndLocInsertion += getZeroLiteralToCompareWithForType(
- Cast->getCastKind(), SubExpr->getType(), Context, UseUpperCaseLiteralSuffix);
+ Cast->getCastKind(), SubExpr->getType(), Context,
+ UseUpperCaseLiteralSuffix);
if (NeedOuterParens) {
EndLocInsertion += ")";
@@ -264,7 +266,8 @@ 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)) {}
void ImplicitBoolConversionCheck::storeOptions(
ClangTidyOptions::OptionMap &Opts) {
@@ -395,7 +398,8 @@ void ImplicitBoolConversionCheck::handleCastToBool(const ImplicitCastExpr *Cast,
if (!EquivalentLiteral.empty()) {
Diag << tooling::fixit::createReplacement(*Cast, EquivalentLiteral);
} else {
- fixGenericExprCastToBool(Diag, Cast, Parent, Context, UseUpperCaseLiteralSuffix);
+ fixGenericExprCastToBool(Diag, Cast, Parent, Context,
+ UseUpperCaseLiteralSuffix);
}
}
>From 96e1230623037ff8b2c90e72ce434dfa33caf9f2 Mon Sep 17 00:00:00 2001
From: Ezike Ebuka <yerimyah1 at gmail.com>
Date: Fri, 16 Aug 2024 20:42:18 +0100
Subject: [PATCH 11/11] Resolve review changes
---
.../ImplicitBoolConversionCheck.cpp | 56 +++++++++----------
clang-tools-extra/docs/ReleaseNotes.rst | 5 +-
.../readability/implicit-bool-conversion.rst | 15 +++--
3 files changed, 36 insertions(+), 40 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
index 825455e822bfc5..98469d025cafdc 100644
--- a/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/ImplicitBoolConversionCheck.cpp
@@ -39,22 +39,14 @@ AST_MATCHER(Stmt, isNULLMacroExpansion) {
}
StringRef getZeroLiteralToCompareWithForType(CastKind CastExprKind,
- QualType Type, ASTContext &Context,
- bool UseUpperCaseLiteralSuffix) {
+ QualType Type,
+ ASTContext &Context) {
switch (CastExprKind) {
- case CK_IntegralToBoolean: {
- if (Type->isUnsignedIntegerType())
- return UseUpperCaseLiteralSuffix ? "0U" : "0u";
+ case CK_IntegralToBoolean:
+ return Type->isUnsignedIntegerType() ? "0u" : "0";
- return "0";
- }
-
- case CK_FloatingToBoolean: {
- if (Context.hasSameType(Type, Context.FloatTy)) {
- return UseUpperCaseLiteralSuffix ? "0.0F" : "0.0f";
- }
- return "0.0";
- }
+ case CK_FloatingToBoolean:
+ return Context.hasSameType(Type, Context.FloatTy) ? "0.0f" : "0.0";
case CK_PointerToBoolean:
case CK_MemberPointerToBoolean: // Fall-through on purpose.
@@ -121,9 +113,13 @@ void fixGenericExprCastToBool(DiagnosticBuilder &Diag,
EndLocInsertion += " != ";
}
- EndLocInsertion += getZeroLiteralToCompareWithForType(
- Cast->getCastKind(), SubExpr->getType(), Context,
- UseUpperCaseLiteralSuffix);
+ const StringRef ZeroLiteral = getZeroLiteralToCompareWithForType(
+ Cast->getCastKind(), SubExpr->getType(), Context);
+
+ if (UseUpperCaseLiteralSuffix)
+ EndLocInsertion += ZeroLiteral.upper();
+ else
+ EndLocInsertion += ZeroLiteral;
if (NeedOuterParens) {
EndLocInsertion += ")";
@@ -202,8 +198,7 @@ void fixGenericExprCastFromBool(DiagnosticBuilder &Diag,
}
StringRef getEquivalentForBoolLiteral(const CXXBoolLiteralExpr *BoolLiteral,
- QualType DestType, ASTContext &Context,
- bool UseUpperCaseLiteralSuffix) {
+ QualType DestType, ASTContext &Context) {
// Prior to C++11, false literal could be implicitly converted to pointer.
if (!Context.getLangOpts().CPlusPlus11 &&
(DestType->isPointerType() || DestType->isMemberPointerType()) &&
@@ -213,19 +208,13 @@ StringRef getEquivalentForBoolLiteral(const CXXBoolLiteralExpr *BoolLiteral,
if (DestType->isFloatingType()) {
if (Context.hasSameType(DestType, Context.FloatTy)) {
- if (BoolLiteral->getValue())
- return UseUpperCaseLiteralSuffix ? "1.0F" : "1.0f";
-
- return UseUpperCaseLiteralSuffix ? "0.0F" : "0.0f";
+ return BoolLiteral->getValue() ? "1.0f" : "0.0f";
}
return BoolLiteral->getValue() ? "1.0" : "0.0";
}
if (DestType->isUnsignedIntegerType()) {
- if (BoolLiteral->getValue())
- return UseUpperCaseLiteralSuffix ? "1U" : "1u";
-
- return UseUpperCaseLiteralSuffix ? "0U" : "0u";
+ return BoolLiteral->getValue() ? "1u" : "0u";
}
return BoolLiteral->getValue() ? "1" : "0";
}
@@ -413,9 +402,16 @@ void ImplicitBoolConversionCheck::handleCastFromBool(
if (const auto *BoolLiteral =
dyn_cast<CXXBoolLiteralExpr>(Cast->getSubExpr()->IgnoreParens())) {
- Diag << tooling::fixit::createReplacement(
- *Cast, getEquivalentForBoolLiteral(BoolLiteral, DestType, Context,
- UseUpperCaseLiteralSuffix));
+
+ const auto EquivalentForBoolLiteral =
+ getEquivalentForBoolLiteral(BoolLiteral, DestType, Context);
+ if (UseUpperCaseLiteralSuffix) {
+ Diag << tooling::fixit::createReplacement(
+ *Cast, EquivalentForBoolLiteral.upper());
+ } else {
+ Diag << tooling::fixit::createReplacement(*Cast,
+ EquivalentForBoolLiteral);
+ }
} else {
fixGenericExprCastFromBool(Diag, Cast, Context, DestType.getAsString());
}
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 123c7ec4ab7ae0..90dc926bcc5811 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -108,8 +108,9 @@ Changes in existing checks
<clang-tidy/checks/readability/redundant-smartptr-get>` check to
remove `->`, when reduntant `get()` is removed.
-- Added option `UseUpperCaseLiteralSuffix` to :doc:`readablility-implicit-bool-conversion
- <clang-tidy/checks/readability/implicit-bool-conversion>` check to select the
+- Improved :doc:`readablility-implicit-bool-conversion
+ <clang-tidy/checks/readability/implicit-bool-conversion>` check
+ Added option `UseUpperCaseLiteralSuffix` to to select the
case of the literal suffix in fixes.
Removed checks
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 4d6b83d304fcd0..be56beebe394d8 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
@@ -137,14 +137,13 @@ Options
.. option:: UseUpperCaseLiteralSuffix
When `true`, the replacements will use an uppercase literal suffix in the
- provided fixes.
+ provided fixes. Default a lowercase literal suffix is used.
-Example
-^^^^^^^
+ Example
-.. code-block:: c++
+ .. code-block:: c++
- uint32_t foo;
- if (foo) {}
- // ^ propose replacement default: if (foo != 0u) {}
- // ^ propose replacement with option `UseUpperCaseLiteralSuffix`: if (foo != 0U) {}
+ uint32_t foo;
+ if (foo) {}
+ // ^ propose replacement default: if (foo != 0u) {}
+ // ^ propose replacement with option `UseUpperCaseLiteralSuffix`: if (foo != 0U) {}
More information about the cfe-commits
mailing list