Skip to content

Commit 75de896

Browse files
committedAug 8, 2016
[clang-tidy] enhance modernize-use-bool-literals to check ternary operator
modernize-use-bool-literals doesn't checks operands in ternary operator. For example: ``` c++ static int Value = 1; bool foo() { bool Result = Value == 1 ? 1 : 0; return Result; } bool boo() { return Value == 1 ? 1 : 0; } ``` This issue was reported in bug 28854. The patch fixes it. Reviewers: alexfh, aaron.ballman, Prazek Subscribers: Prazek, Eugene.Zelenko Differential Revision: https://reviews.llvm.org/D23243 llvm-svn: 278022
1 parent b071092 commit 75de896

File tree

3 files changed

+59
-16
lines changed

3 files changed

+59
-16
lines changed
 

‎clang-tools-extra/clang-tidy/modernize/UseBoolLiteralsCheck.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,17 @@ void UseBoolLiteralsCheck::registerMatchers(MatchFinder *Finder) {
2929
unless(isInTemplateInstantiation()),
3030
anyOf(hasParent(explicitCastExpr().bind("cast")), anything())),
3131
this);
32+
33+
Finder->addMatcher(
34+
conditionalOperator(
35+
hasParent(implicitCastExpr(
36+
hasImplicitDestinationType(qualType(booleanType())),
37+
unless(isInTemplateInstantiation()))),
38+
eachOf(hasTrueExpression(
39+
ignoringParenImpCasts(integerLiteral().bind("literal"))),
40+
hasFalseExpression(
41+
ignoringParenImpCasts(integerLiteral().bind("literal"))))),
42+
this);
3243
}
3344

3445
void UseBoolLiteralsCheck::check(const MatchFinder::MatchResult &Result) {

‎clang-tools-extra/docs/clang-tidy/checks/modernize-use-bool-literals.rst

+2
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@ Finds integer literals which are cast to ``bool``.
1010
bool p = 1;
1111
bool f = static_cast<bool>(1);
1212
std::ios_base::sync_with_stdio(0);
13+
bool x = p ? 1 : 0;
1314

1415
// transforms to
1516

1617
bool p = true;
1718
bool f = true;
1819
std::ios_base::sync_with_stdio(false);
20+
bool x = p ? true : false;

‎clang-tools-extra/test/clang-tidy/modernize-use-bool-literals.cpp

+46-16
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,30 @@ bool IntToTrue = 1;
55
// CHECK-FIXES: {{^}}bool IntToTrue = true;{{$}}
66

77
bool IntToFalse(0);
8-
// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: {{.*}}
8+
// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: converting integer literal to bool
99
// CHECK-FIXES: {{^}}bool IntToFalse(false);{{$}}
1010

1111
bool LongLongToTrue{0x1LL};
12-
// CHECK-MESSAGES: :[[@LINE-1]]:21: warning: {{.*}}
12+
// CHECK-MESSAGES: :[[@LINE-1]]:21: warning: converting integer literal to bool
1313
// CHECK-FIXES: {{^}}bool LongLongToTrue{true};{{$}}
1414

1515
bool ExplicitCStyleIntToFalse = (bool)0;
16-
// CHECK-MESSAGES: :[[@LINE-1]]:33: warning: {{.*}}
16+
// CHECK-MESSAGES: :[[@LINE-1]]:33: warning: converting integer literal to bool
1717
// CHECK-FIXES: {{^}}bool ExplicitCStyleIntToFalse = false;{{$}}
1818

1919
bool ExplicitFunctionalIntToFalse = bool(0);
20-
// CHECK-MESSAGES: :[[@LINE-1]]:37: warning: {{.*}}
20+
// CHECK-MESSAGES: :[[@LINE-1]]:37: warning: converting integer literal to bool
2121
// CHECK-FIXES: {{^}}bool ExplicitFunctionalIntToFalse = false;{{$}}
2222

2323
bool ExplicitStaticIntToFalse = static_cast<bool>(0);
24-
// CHECK-MESSAGES: :[[@LINE-1]]:33: warning: {{.*}}
24+
// CHECK-MESSAGES: :[[@LINE-1]]:33: warning: converting integer literal to bool
2525
// CHECK-FIXES: {{^}}bool ExplicitStaticIntToFalse = false;{{$}}
2626

2727
#define TRUE_MACRO 1
2828
// CHECK-FIXES: {{^}}#define TRUE_MACRO 1{{$}}
2929

3030
bool MacroIntToTrue = TRUE_MACRO;
31-
// CHECK-MESSAGES: :[[@LINE-1]]:23: warning: converting integer literal to bool, use bool literal instead [modernize-use-bool-literals]
31+
// CHECK-MESSAGES: :[[@LINE-1]]:23: warning: converting integer literal to bool
3232
// CHECK-FIXES: {{^}}bool MacroIntToTrue = TRUE_MACRO;{{$}}
3333

3434
#define FALSE_MACRO bool(0)
@@ -37,7 +37,7 @@ bool MacroIntToTrue = TRUE_MACRO;
3737
bool TrueBool = true; // OK
3838

3939
bool FalseBool = bool(FALSE_MACRO);
40-
// CHECK-MESSAGES: :[[@LINE-1]]:23: warning: {{.*}}
40+
// CHECK-MESSAGES: :[[@LINE-1]]:23: warning: converting integer literal to bool
4141
// CHECK-FIXES: {{^}}bool FalseBool = bool(FALSE_MACRO);{{$}}
4242

4343
void boolFunction(bool bar) {
@@ -52,28 +52,28 @@ unsigned long long LongInteger = 1; // OK
5252
// CHECK-FIXES: {{^}}#define MACRO_DEPENDENT_CAST(x) static_cast<bool>(x){{$}}
5353

5454
bool MacroDependentBool = MACRO_DEPENDENT_CAST(0);
55-
// CHECK-MESSAGES: :[[@LINE-1]]:27: warning: {{.*}}
55+
// CHECK-MESSAGES: :[[@LINE-1]]:27: warning: converting integer literal to bool
5656
// CHECK-FIXES: {{^}}bool MacroDependentBool = MACRO_DEPENDENT_CAST(0);{{$}}
5757

5858
bool ManyMacrosDependent = MACRO_DEPENDENT_CAST(FALSE_MACRO);
59-
// CHECK-MESSAGES: :[[@LINE-1]]:49: warning: {{.*}}
59+
// CHECK-MESSAGES: :[[@LINE-1]]:49: warning: converting integer literal to bool
6060
// CHECK-FIXES: {{^}}bool ManyMacrosDependent = MACRO_DEPENDENT_CAST(FALSE_MACRO);{{$}}
6161

6262
class FooClass {
6363
public:
6464
FooClass() : JustBool(0) {}
65-
// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: {{.*}}
65+
// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: converting integer literal to bool
6666
// CHECK-FIXES: {{^ *}}FooClass() : JustBool(false) {}{{$}}
6767
FooClass(int) : JustBool{0} {}
68-
// CHECK-MESSAGES: :[[@LINE-1]]:28: warning: {{.*}}
68+
// CHECK-MESSAGES: :[[@LINE-1]]:28: warning: converting integer literal to bool
6969
// CHECK-FIXES: {{^ *}}FooClass(int) : JustBool{false} {}{{$}}
7070
private:
7171
bool JustBool;
7272
bool BoolWithBraces{0};
73-
// CHECK-MESSAGES: :[[@LINE-1]]:23: warning: {{.*}}
73+
// CHECK-MESSAGES: :[[@LINE-1]]:23: warning: converting integer literal to bool
7474
// CHECK-FIXES: {{^ *}}bool BoolWithBraces{false};{{$}}
7575
bool BoolFromInt = 0;
76-
// CHECK-MESSAGES: :[[@LINE-1]]:22: warning: {{.*}}
76+
// CHECK-MESSAGES: :[[@LINE-1]]:22: warning: converting integer literal to bool
7777
// CHECK-FIXES: {{^ *}}bool BoolFromInt = false;{{$}}
7878
bool SimpleBool = true; // OK
7979
};
@@ -93,13 +93,13 @@ void valueDependentTemplateFunction() {
9393
template<typename type>
9494
void anotherTemplateFunction(type) {
9595
bool JustBool = 0;
96-
// CHECK-MESSAGES: :[[@LINE-1]]:19: warning: {{.*}}
96+
// CHECK-MESSAGES: :[[@LINE-1]]:19: warning: converting integer literal to bool
9797
// CHECK-FIXES: {{^ *}}bool JustBool = false;{{$}}
9898
}
9999

100100
int main() {
101101
boolFunction(1);
102-
// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: {{.*}}
102+
// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: converting integer literal to bool
103103
// CHECK-FIXES: {{^ *}}boolFunction(true);{{$}}
104104

105105
boolFunction(false);
@@ -113,6 +113,36 @@ int main() {
113113
anotherTemplateFunction(1);
114114

115115
IntToTrue = 1;
116-
// CHECK-MESSAGES: :[[@LINE-1]]:15: warning: {{.*}}
116+
// CHECK-MESSAGES: :[[@LINE-1]]:15: warning: converting integer literal to bool
117117
// CHECK-FIXES: {{^ *}}IntToTrue = true;{{$}}
118118
}
119+
120+
static int Value = 1;
121+
122+
bool Function1() {
123+
bool Result = Value == 1 ? 1 : 0;
124+
// CHECK-MESSAGES: :[[@LINE-1]]:30: warning: converting integer literal to bool
125+
// CHECK-MESSAGES: :[[@LINE-2]]:34: warning: converting integer literal to bool
126+
// CHECK-FIXES: {{^ *}}bool Result = Value == 1 ? true : false;{{$}}
127+
return Result;
128+
}
129+
130+
bool Function2() {
131+
return Value == 1 ? 1 : 0;
132+
// CHECK-MESSAGES: :[[@LINE-1]]:23: warning: converting integer literal to bool
133+
// CHECK-MESSAGES: :[[@LINE-2]]:27: warning: converting integer literal to bool
134+
// CHECK-FIXES: {{^ *}}return Value == 1 ? true : false;{{$}}
135+
}
136+
137+
void foo() {
138+
bool Result;
139+
Result = Value == 1 ? true : 0;
140+
// CHECK-MESSAGES: :[[@LINE-1]]:32: warning: converting integer literal to bool
141+
// CHECK-FIXES: {{^ *}}Result = Value == 1 ? true : false;{{$}}
142+
Result = Value == 1 ? false : bool(0);
143+
// CHECK-MESSAGES: :[[@LINE-1]]:33: warning: converting integer literal to bool
144+
// CHECK-FIXES: {{^ *}}Result = Value == 1 ? false : false;{{$}}
145+
Result = Value == 1 ? (bool)0 : false;
146+
// CHECK-MESSAGES: :[[@LINE-1]]:25: warning: converting integer literal to bool
147+
// CHECK-FIXES: {{^ *}}Result = Value == 1 ? false : false;{{$}}
148+
}

0 commit comments

Comments
 (0)
Please sign in to comment.