[clang-tools-extra] r260097 - Reverting r260096; it causes build bot failures:
Aaron Ballman via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 8 06:37:57 PST 2016
Author: aaronballman
Date: Mon Feb 8 08:37:56 2016
New Revision: 260097
URL: http://llvm.org/viewvc/llvm-project?rev=260097&view=rev
Log:
Reverting r260096; it causes build bot failures:
http://bb.pgr.jp/builders/cmake-clang-tools-x86_64-linux/builds/23351
http://lab.llvm.org:8011/builders/clang-s390x-linux/builds/492
Modified:
clang-tools-extra/trunk/clang-tidy/readability/SimplifyBooleanExprCheck.cpp
clang-tools-extra/trunk/clang-tidy/readability/SimplifyBooleanExprCheck.h
clang-tools-extra/trunk/docs/clang-tidy/checks/readability-simplify-boolean-expr.rst
clang-tools-extra/trunk/test/clang-tidy/readability-simplify-bool-expr.cpp
Modified: clang-tools-extra/trunk/clang-tidy/readability/SimplifyBooleanExprCheck.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/readability/SimplifyBooleanExprCheck.cpp?rev=260097&r1=260096&r2=260097&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/readability/SimplifyBooleanExprCheck.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/readability/SimplifyBooleanExprCheck.cpp Mon Feb 8 08:37:56 2016
@@ -85,11 +85,10 @@ bool needsParensAfterUnaryNegation(const
E = E->IgnoreImpCasts();
if (isa<BinaryOperator>(E) || isa<ConditionalOperator>(E))
return true;
-
- if (const auto *Op = dyn_cast<CXXOperatorCallExpr>(E))
+ if (const auto *Op = dyn_cast<CXXOperatorCallExpr>(E)) {
return Op->getNumArgs() == 2 && Op->getOperator() != OO_Call &&
Op->getOperator() != OO_Subscript;
-
+ }
return false;
}
@@ -108,8 +107,12 @@ StringRef negatedOperator(const BinaryOp
}
std::pair<OverloadedOperatorKind, StringRef> OperatorNames[] = {
- {OO_EqualEqual, "=="}, {OO_ExclaimEqual, "!="}, {OO_Less, "<"},
- {OO_GreaterEqual, ">="}, {OO_Greater, ">"}, {OO_LessEqual, "<="}};
+ {OO_EqualEqual, "=="},
+ {OO_ExclaimEqual, "!="},
+ {OO_Less, "<"},
+ {OO_GreaterEqual, ">="},
+ {OO_Greater, ">"},
+ {OO_LessEqual, "<="}};
StringRef getOperatorName(OverloadedOperatorKind OpKind) {
for (auto Name : OperatorNames) {
@@ -145,15 +148,7 @@ std::string asBool(StringRef text, bool
bool needsNullPtrComparison(const Expr *E) {
if (const auto *ImpCast = dyn_cast<ImplicitCastExpr>(E))
- return ImpCast->getCastKind() == CK_PointerToBoolean ||
- ImpCast->getCastKind() == CK_MemberPointerToBoolean;
-
- return false;
-}
-
-bool needsZeroComparison(const Expr *E) {
- if (const auto *ImpCast = dyn_cast<ImplicitCastExpr>(E))
- return ImpCast->getCastKind() == CK_IntegralToBoolean;
+ return ImpCast->getCastKind() == CK_PointerToBoolean;
return false;
}
@@ -177,27 +172,6 @@ bool needsStaticCast(const Expr *E) {
return !E->getType()->isBooleanType();
}
-std::string compareExpressionToConstant(const MatchFinder::MatchResult &Result,
- const Expr *E, bool Negated,
- const char *Constant) {
- E = E->IgnoreImpCasts();
- Twine ExprText = isa<BinaryOperator>(E) ? ("(" + getText(Result, *E) + ")")
- : getText(Result, *E);
- return (ExprText + " " + (Negated ? "!=" : "==") + " " + Constant).str();
-}
-
-std::string compareExpressionToNullPtr(const MatchFinder::MatchResult &Result,
- const Expr *E, bool Negated) {
- const char *NullPtr =
- Result.Context->getLangOpts().CPlusPlus11 ? "nullptr" : "NULL";
- return compareExpressionToConstant(Result, E, Negated, NullPtr);
-}
-
-std::string compareExpressionToZero(const MatchFinder::MatchResult &Result,
- const Expr *E, bool Negated) {
- return compareExpressionToConstant(Result, E, Negated, "0");
-}
-
std::string replacementExpression(const MatchFinder::MatchResult &Result,
bool Negated, const Expr *E) {
E = E->ignoreParenBaseCasts();
@@ -206,20 +180,14 @@ std::string replacementExpression(const
if (const auto *UnOp = dyn_cast<UnaryOperator>(E)) {
if (UnOp->getOpcode() == UO_LNot) {
if (needsNullPtrComparison(UnOp->getSubExpr()))
- return compareExpressionToNullPtr(Result, UnOp->getSubExpr(), true);
-
- if (needsZeroComparison(UnOp->getSubExpr()))
- return compareExpressionToZero(Result, UnOp->getSubExpr(), true);
+ return (getText(Result, *UnOp->getSubExpr()) + " != nullptr").str();
return replacementExpression(Result, false, UnOp->getSubExpr());
}
}
if (needsNullPtrComparison(E))
- return compareExpressionToNullPtr(Result, E, false);
-
- if (needsZeroComparison(E))
- return compareExpressionToZero(Result, E, false);
+ return (getText(Result, *E) + " == nullptr").str();
StringRef NegatedOperator;
const Expr *LHS = nullptr;
@@ -235,21 +203,18 @@ std::string replacementExpression(const
RHS = OpExpr->getArg(1);
}
}
- if (!NegatedOperator.empty() && LHS && RHS)
+ if (!NegatedOperator.empty() && LHS && RHS) {
return (asBool((getText(Result, *LHS) + " " + NegatedOperator + " " +
- getText(Result, *RHS))
- .str(),
+ getText(Result, *RHS)).str(),
NeedsStaticCast));
+ }
StringRef Text = getText(Result, *E);
if (!NeedsStaticCast && needsParensAfterUnaryNegation(E))
return ("!(" + Text + ")").str();
if (needsNullPtrComparison(E))
- return compareExpressionToNullPtr(Result, E, false);
-
- if (needsZeroComparison(E))
- return compareExpressionToZero(Result, E, false);
+ return (getText(Result, *E) + " == nullptr").str();
return ("!" + asBool(Text, NeedsStaticCast));
}
@@ -257,18 +222,12 @@ std::string replacementExpression(const
if (const auto *UnOp = dyn_cast<UnaryOperator>(E)) {
if (UnOp->getOpcode() == UO_LNot) {
if (needsNullPtrComparison(UnOp->getSubExpr()))
- return compareExpressionToNullPtr(Result, UnOp->getSubExpr(), false);
-
- if (needsZeroComparison(UnOp->getSubExpr()))
- return compareExpressionToZero(Result, UnOp->getSubExpr(), false);
+ return (getText(Result, *UnOp->getSubExpr()) + " == nullptr").str();
}
}
if (needsNullPtrComparison(E))
- return compareExpressionToNullPtr(Result, E, true);
-
- if (needsZeroComparison(E))
- return compareExpressionToZero(Result, E, true);
+ return (getText(Result, *E) + " != nullptr").str();
return asBool(getText(Result, *E), NeedsStaticCast);
}
@@ -299,26 +258,6 @@ const CXXBoolLiteralExpr *stmtReturnsBoo
return nullptr;
}
-bool containsDiscardedTokens(const MatchFinder::MatchResult &Result,
- CharSourceRange CharRange) {
- std::string ReplacementText =
- Lexer::getSourceText(CharRange, *Result.SourceManager,
- Result.Context->getLangOpts())
- .str();
- Lexer Lex(CharRange.getBegin(), Result.Context->getLangOpts(),
- ReplacementText.data(), ReplacementText.data(),
- ReplacementText.data() + ReplacementText.size());
- Lex.SetCommentRetentionState(true);
-
- Token Tok;
- while (!Lex.LexFromRawLexer(Tok)) {
- if (Tok.is(tok::TokenKind::comment) || Tok.is(tok::TokenKind::hash))
- return true;
- }
-
- return false;
-}
-
} // namespace
SimplifyBooleanExprCheck::SimplifyBooleanExprCheck(StringRef Name,
@@ -362,13 +301,12 @@ void SimplifyBooleanExprCheck::matchBool
StringRef OperatorName,
StringRef BooleanId) {
Finder->addMatcher(
- binaryOperator(
- isExpansionInMainFile(), hasOperatorName(OperatorName),
- hasLHS(allOf(
- expr().bind(LHSId),
- ignoringImpCasts(cxxBoolLiteral(equals(Value)).bind(BooleanId)))),
- hasRHS(expr().bind(RHSId)),
- unless(hasRHS(hasDescendant(cxxBoolLiteral())))),
+ binaryOperator(isExpansionInMainFile(), hasOperatorName(OperatorName),
+ hasLHS(allOf(expr().bind(LHSId),
+ ignoringImpCasts(cxxBoolLiteral(equals(Value))
+ .bind(BooleanId)))),
+ hasRHS(expr().bind(RHSId)),
+ unless(hasRHS(hasDescendant(cxxBoolLiteral())))),
this);
}
@@ -377,24 +315,22 @@ void SimplifyBooleanExprCheck::matchExpr
StringRef OperatorName,
StringRef BooleanId) {
Finder->addMatcher(
- binaryOperator(
- isExpansionInMainFile(), hasOperatorName(OperatorName),
- unless(hasLHS(hasDescendant(cxxBoolLiteral()))),
- hasLHS(expr().bind(LHSId)),
- hasRHS(allOf(expr().bind(RHSId),
- ignoringImpCasts(
- cxxBoolLiteral(equals(Value)).bind(BooleanId))))),
+ binaryOperator(isExpansionInMainFile(), hasOperatorName(OperatorName),
+ unless(hasLHS(hasDescendant(cxxBoolLiteral()))),
+ hasLHS(expr().bind(LHSId)),
+ hasRHS(allOf(expr().bind(RHSId),
+ ignoringImpCasts(cxxBoolLiteral(equals(Value))
+ .bind(BooleanId))))),
this);
}
void SimplifyBooleanExprCheck::matchBoolCondition(MatchFinder *Finder,
bool Value,
StringRef BooleanId) {
- Finder->addMatcher(
- ifStmt(isExpansionInMainFile(),
- hasCondition(cxxBoolLiteral(equals(Value)).bind(BooleanId)))
- .bind(IfStmtId),
- this);
+ Finder->addMatcher(ifStmt(isExpansionInMainFile(),
+ hasCondition(cxxBoolLiteral(equals(Value))
+ .bind(BooleanId))).bind(IfStmtId),
+ this);
}
void SimplifyBooleanExprCheck::matchTernaryResult(MatchFinder *Finder,
@@ -410,19 +346,18 @@ void SimplifyBooleanExprCheck::matchTern
void SimplifyBooleanExprCheck::matchIfReturnsBool(MatchFinder *Finder,
bool Value, StringRef Id) {
- if (ChainedConditionalReturn)
+ if (ChainedConditionalReturn) {
Finder->addMatcher(ifStmt(isExpansionInMainFile(),
hasThen(returnsBool(Value, ThenLiteralId)),
- hasElse(returnsBool(!Value)))
- .bind(Id),
+ hasElse(returnsBool(!Value))).bind(Id),
this);
- else
+ } else {
Finder->addMatcher(ifStmt(isExpansionInMainFile(),
unless(hasParent(ifStmt())),
hasThen(returnsBool(Value, ThenLiteralId)),
- hasElse(returnsBool(!Value)))
- .bind(Id),
+ hasElse(returnsBool(!Value))).bind(Id),
this);
+ }
}
void SimplifyBooleanExprCheck::matchIfAssignsBool(MatchFinder *Finder,
@@ -440,16 +375,16 @@ void SimplifyBooleanExprCheck::matchIfAs
hasRHS(cxxBoolLiteral(equals(!Value))));
auto Else = anyOf(SimpleElse, compoundStmt(statementCountIs(1),
hasAnySubstatement(SimpleElse)));
- if (ChainedConditionalAssignment)
+ if (ChainedConditionalAssignment) {
Finder->addMatcher(
ifStmt(isExpansionInMainFile(), hasThen(Then), hasElse(Else)).bind(Id),
this);
- else
+ } else {
Finder->addMatcher(ifStmt(isExpansionInMainFile(),
unless(hasParent(ifStmt())), hasThen(Then),
- hasElse(Else))
- .bind(Id),
+ hasElse(Else)).bind(Id),
this);
+ }
}
void SimplifyBooleanExprCheck::matchCompoundIfReturnsBool(MatchFinder *Finder,
@@ -460,8 +395,7 @@ void SimplifyBooleanExprCheck::matchComp
unless(hasElse(stmt())))),
hasAnySubstatement(
returnStmt(has(cxxBoolLiteral(equals(!Value))))
- .bind(CompoundReturnId))))
- .bind(Id),
+ .bind(CompoundReturnId)))).bind(Id),
this);
}
@@ -510,46 +444,69 @@ void SimplifyBooleanExprCheck::registerM
void SimplifyBooleanExprCheck::check(const MatchFinder::MatchResult &Result) {
if (const CXXBoolLiteralExpr *LeftRemoved =
- getBoolLiteral(Result, RightExpressionId))
+ getBoolLiteral(Result, RightExpressionId)) {
replaceWithExpression(Result, LeftRemoved, false);
- else if (const CXXBoolLiteralExpr *RightRemoved =
- getBoolLiteral(Result, LeftExpressionId))
+ } else if (const CXXBoolLiteralExpr *RightRemoved =
+ getBoolLiteral(Result, LeftExpressionId)) {
replaceWithExpression(Result, RightRemoved, true);
- else if (const CXXBoolLiteralExpr *NegatedLeftRemoved =
- getBoolLiteral(Result, NegatedRightExpressionId))
+ } else if (const CXXBoolLiteralExpr *NegatedLeftRemoved =
+ getBoolLiteral(Result, NegatedRightExpressionId)) {
replaceWithExpression(Result, NegatedLeftRemoved, false, true);
- else if (const CXXBoolLiteralExpr *NegatedRightRemoved =
- getBoolLiteral(Result, NegatedLeftExpressionId))
+ } else if (const CXXBoolLiteralExpr *NegatedRightRemoved =
+ getBoolLiteral(Result, NegatedLeftExpressionId)) {
replaceWithExpression(Result, NegatedRightRemoved, true, true);
- else if (const CXXBoolLiteralExpr *TrueConditionRemoved =
- getBoolLiteral(Result, ConditionThenStmtId))
+ } else if (const CXXBoolLiteralExpr *TrueConditionRemoved =
+ getBoolLiteral(Result, ConditionThenStmtId)) {
replaceWithThenStatement(Result, TrueConditionRemoved);
- else if (const CXXBoolLiteralExpr *FalseConditionRemoved =
- getBoolLiteral(Result, ConditionElseStmtId))
+ } else if (const CXXBoolLiteralExpr *FalseConditionRemoved =
+ getBoolLiteral(Result, ConditionElseStmtId)) {
replaceWithElseStatement(Result, FalseConditionRemoved);
- else if (const auto *Ternary =
- Result.Nodes.getNodeAs<ConditionalOperator>(TernaryId))
+ } else if (const auto *Ternary =
+ Result.Nodes.getNodeAs<ConditionalOperator>(TernaryId)) {
replaceWithCondition(Result, Ternary);
- else if (const auto *TernaryNegated =
- Result.Nodes.getNodeAs<ConditionalOperator>(TernaryNegatedId))
+ } else if (const auto *TernaryNegated =
+ Result.Nodes.getNodeAs<ConditionalOperator>(
+ TernaryNegatedId)) {
replaceWithCondition(Result, TernaryNegated, true);
- else if (const auto *If = Result.Nodes.getNodeAs<IfStmt>(IfReturnsBoolId))
+ } else if (const auto *If = Result.Nodes.getNodeAs<IfStmt>(IfReturnsBoolId)) {
replaceWithReturnCondition(Result, If);
- else if (const auto *IfNot =
- Result.Nodes.getNodeAs<IfStmt>(IfReturnsNotBoolId))
+ } else if (const auto *IfNot =
+ Result.Nodes.getNodeAs<IfStmt>(IfReturnsNotBoolId)) {
replaceWithReturnCondition(Result, IfNot, true);
- else if (const auto *IfAssign =
- Result.Nodes.getNodeAs<IfStmt>(IfAssignBoolId))
+ } else if (const auto *IfAssign =
+ Result.Nodes.getNodeAs<IfStmt>(IfAssignBoolId)) {
replaceWithAssignment(Result, IfAssign);
- else if (const auto *IfAssignNot =
- Result.Nodes.getNodeAs<IfStmt>(IfAssignNotBoolId))
+ } else if (const auto *IfAssignNot =
+ Result.Nodes.getNodeAs<IfStmt>(IfAssignNotBoolId)) {
replaceWithAssignment(Result, IfAssignNot, true);
- else if (const auto *Compound =
- Result.Nodes.getNodeAs<CompoundStmt>(CompoundBoolId))
+ } else if (const auto *Compound =
+ Result.Nodes.getNodeAs<CompoundStmt>(CompoundBoolId)) {
replaceCompoundReturnWithCondition(Result, Compound);
- else if (const auto *Compound =
- Result.Nodes.getNodeAs<CompoundStmt>(CompoundNotBoolId))
+ } else if (const auto *Compound =
+ Result.Nodes.getNodeAs<CompoundStmt>(CompoundNotBoolId)) {
replaceCompoundReturnWithCondition(Result, Compound, true);
+ }
+}
+
+bool containsDiscardedTokens(
+ const ast_matchers::MatchFinder::MatchResult &Result,
+ CharSourceRange CharRange) {
+ std::string ReplacementText =
+ Lexer::getSourceText(CharRange, *Result.SourceManager,
+ Result.Context->getLangOpts())
+ .str();
+ Lexer Lex(CharRange.getBegin(), Result.Context->getLangOpts(),
+ ReplacementText.data(), ReplacementText.data(),
+ ReplacementText.data() + ReplacementText.size());
+ Lex.SetCommentRetentionState(true);
+ Token Tok;
+
+ while (!Lex.LexFromRawLexer(Tok)) {
+ if (Tok.is(tok::TokenKind::comment) || Tok.is(tok::TokenKind::hash))
+ return true;
+ }
+
+ return false;
}
void SimplifyBooleanExprCheck::issueDiag(
@@ -625,7 +582,7 @@ void SimplifyBooleanExprCheck::replaceCo
// The body shouldn't be empty because the matcher ensures that it must
// contain at least two statements:
// 1) A `return` statement returning a boolean literal `false` or `true`
- // 2) An `if` statement with no `else` clause that consists of a single
+ // 2) An `if` statement with no `else` clause that consists fo a single
// `return` statement returning the opposite boolean literal `true` or
// `false`.
assert(Compound->size() >= 2);
Modified: clang-tools-extra/trunk/clang-tidy/readability/SimplifyBooleanExprCheck.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/readability/SimplifyBooleanExprCheck.h?rev=260097&r1=260096&r2=260097&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/readability/SimplifyBooleanExprCheck.h (original)
+++ clang-tools-extra/trunk/clang-tidy/readability/SimplifyBooleanExprCheck.h Mon Feb 8 08:37:56 2016
@@ -19,8 +19,75 @@ namespace readability {
/// Looks for boolean expressions involving boolean constants and simplifies
/// them to use the appropriate boolean expression directly.
///
-/// For the user-facing documentation see:
-/// http://clang.llvm.org/extra/clang-tidy/checks/readability-simplify-boolean-expr.html
+/// Examples:
+///
+/// =========================================== ================
+/// Initial expression Result
+/// ------------------------------------------- ----------------
+/// `if (b == true)` `if (b)`
+/// `if (b == false)` `if (!b)`
+/// `if (b && true)` `if (b)`
+/// `if (b && false)` `if (false)`
+/// `if (b || true)` `if (true)`
+/// `if (b || false)` `if (b)`
+/// `e ? true : false` `e`
+/// `e ? false : true` `!e`
+/// `if (true) t(); else f();` `t();`
+/// `if (false) t(); else f();` `f();`
+/// `if (e) return true; else return false;` `return e;`
+/// `if (e) return false; else return true;` `return !e;`
+/// `if (e) b = true; else b = false;` `b = e;`
+/// `if (e) b = false; else b = true;` `b = !e;`
+/// `if (e) return true; return false;` `return e;`
+/// `if (e) return false; return true;` `return !e;`
+/// =========================================== ================
+///
+/// The resulting expression `e` is modified as follows:
+/// 1. Unnecessary parentheses around the expression are removed.
+/// 2. Negated applications of `!` are eliminated.
+/// 3. Negated applications of comparison operators are changed to use the
+/// opposite condition.
+/// 4. Implicit conversions of pointer to `bool` are replaced with explicit
+/// comparisons to `nullptr`.
+/// 5. Implicit casts to `bool` are replaced with explicit casts to `bool`.
+/// 6. Object expressions with `explicit operator bool` conversion operators
+/// are replaced with explicit casts to `bool`.
+///
+/// Examples:
+/// 1. The ternary assignment `bool b = (i < 0) ? true : false;` has redundant
+/// parentheses and becomes `bool b = i < 0;`.
+///
+/// 2. The conditional return `if (!b) return false; return true;` has an
+/// implied double negation and becomes `return b;`.
+///
+/// 3. The conditional return `if (i < 0) return false; return true;` becomes
+/// `return i >= 0;`.
+///
+/// The conditional return `if (i != 0) return false; return true;` becomes
+/// `return i == 0;`.
+///
+/// 4. The conditional return `if (p) return true; return false;` has an
+/// implicit conversion of a pointer to `bool` and becomes
+/// `return p != nullptr;`.
+///
+/// The ternary assignment `bool b = (i & 1) ? true : false;` has an
+/// implicit conversion of `i & 1` to `bool` and becomes
+/// `bool b = static_cast<bool>(i & 1);`.
+///
+/// 5. The conditional return `if (i & 1) return true; else return false;` has
+/// an implicit conversion of an integer quantity `i & 1` to `bool` and
+/// becomes `return static_cast<bool>(i & 1);`
+///
+/// 6. Given `struct X { explicit operator bool(); };`, and an instance `x` of
+/// `struct X`, the conditional return `if (x) return true; return false;`
+/// becomes `return static_cast<bool>(x);`
+///
+/// When a conditional boolean return or assignment appears at the end of a
+/// chain of `if`, `else if` statements, the conditional statement is left
+/// unchanged unless the option `ChainedConditionalReturn` or
+/// `ChainedConditionalAssignment`, respectively, is specified as non-zero.
+/// The default value for both options is zero.
+///
class SimplifyBooleanExprCheck : public ClangTidyCheck {
public:
SimplifyBooleanExprCheck(StringRef Name, ClangTidyContext *Context);
Modified: clang-tools-extra/trunk/docs/clang-tidy/checks/readability-simplify-boolean-expr.rst
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-tidy/checks/readability-simplify-boolean-expr.rst?rev=260097&r1=260096&r2=260097&view=diff
==============================================================================
--- clang-tools-extra/trunk/docs/clang-tidy/checks/readability-simplify-boolean-expr.rst (original)
+++ clang-tools-extra/trunk/docs/clang-tidy/checks/readability-simplify-boolean-expr.rst Mon Feb 8 08:37:56 2016
@@ -35,14 +35,11 @@ The resulting expression ``e`` is modifi
2. Negated applications of ``!`` are eliminated.
3. Negated applications of comparison operators are changed to use the
opposite condition.
- 4. Implicit conversions of pointers, including pointers to members, to
- ``bool`` are replaced with explicit comparisons to ``nullptr`` in C++11
- or ``NULL`` in C++98/03.
+ 4. Implicit conversions of pointer to ``bool`` are replaced with explicit
+ comparisons to ``nullptr``.
5. Implicit casts to ``bool`` are replaced with explicit casts to ``bool``.
6. Object expressions with ``explicit operator bool`` conversion operators
are replaced with explicit casts to ``bool``.
- 7. Implicit conversions of integral types to ``bool`` are replaced with
- explicit comparisons to ``0``.
Examples:
1. The ternary assignment ``bool b = (i < 0) ? true : false;`` has redundant
@@ -63,11 +60,11 @@ Examples:
The ternary assignment ``bool b = (i & 1) ? true : false;`` has an
implicit conversion of ``i & 1`` to ``bool`` and becomes
- ``bool b = (i & 1) != 0;``.
+ ``bool b = static_cast<bool>(i & 1);``.
5. The conditional return ``if (i & 1) return true; else return false;`` has
an implicit conversion of an integer quantity ``i & 1`` to ``bool`` and
- becomes ``return (i & 1) != 0;``
+ becomes ``return static_cast<bool>(i & 1);``
6. Given ``struct X { explicit operator bool(); };``, and an instance ``x`` of
``struct X``, the conditional return ``if (x) return true; return false;``
Modified: clang-tools-extra/trunk/test/clang-tidy/readability-simplify-bool-expr.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/readability-simplify-bool-expr.cpp?rev=260097&r1=260096&r2=260097&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/readability-simplify-bool-expr.cpp (original)
+++ clang-tools-extra/trunk/test/clang-tidy/readability-simplify-bool-expr.cpp Mon Feb 8 08:37:56 2016
@@ -690,7 +690,7 @@ bool if_implicit_bool_expr(int i) {
}
}
// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
-// CHECK-FIXES: {{^}} return (i & 1) != 0;{{$}}
+// CHECK-FIXES: {{^}} return static_cast<bool>(i & 1);{{$}}
bool negated_if_implicit_bool_expr(int i) {
if (i - 1) {
@@ -700,7 +700,7 @@ bool negated_if_implicit_bool_expr(int i
}
}
// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
-// CHECK-FIXES: {{^}} return (i - 1) == 0;{{$}}
+// CHECK-FIXES: {{^}} return !static_cast<bool>(i - 1);{{$}}
bool implicit_int(int i) {
if (i) {
@@ -710,7 +710,7 @@ bool implicit_int(int i) {
}
}
// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
-// CHECK-FIXES: {{^}} return i != 0;{{$}}
+// CHECK-FIXES: {{^}} return static_cast<bool>(i);{{$}}
bool explicit_bool(bool b) {
if (b) {
@@ -757,7 +757,7 @@ bool bitwise_complement_conversion(int i
}
}
// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
-// CHECK-FIXES: {{^}} return ~i != 0;{{$}}
+// CHECK-FIXES: {{^}} return static_cast<bool>(~i);{{$}}
bool logical_or(bool a, bool b) {
if (a || b) {
@@ -830,7 +830,7 @@ void ternary_integer_condition(int i) {
bool b = i ? true : false;
}
// CHECK-MESSAGES: :[[@LINE-2]]:16: warning: {{.*}} in ternary expression result
-// CHECK-FIXES: bool b = i != 0;{{$}}
+// CHECK-FIXES: bool b = static_cast<bool>(i);{{$}}
bool non_null_pointer_condition(int *p1) {
if (p1) {
@@ -895,38 +895,3 @@ bool preprocessor_in_the_middle(bool b)
// CHECK-MESSAGES: :[[@LINE-6]]:12: warning: {{.*}} in conditional return
// CHECK-FIXES: {{^}} if (b) {
// CHECK-FIXES: {{^}}#define SOMETHING_WICKED false
-
-bool integer_not_zero(int i) {
- if (i) {
- return false;
- } else {
- return true;
- }
-}
-// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
-// CHECK-FIXES: {{^}} return i == 0;{{$}}
-
-class A {
-public:
- int m;
-};
-
-bool member_pointer_nullptr(int A::*p) {
- if (p) {
- return true;
- } else {
- return false;
- }
-}
-// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
-// CHECK-FIXES: return p != nullptr;{{$}}
-
-bool integer_member_implicit_cast(A *p) {
- if (p->m) {
- return true;
- } else {
- return false;
- }
-}
-// CHECK-MESSAGES: :[[@LINE-5]]:12: warning: {{.*}} in conditional return
-// CHECK-FIXES: return p->m != 0;{{$}}
More information about the cfe-commits
mailing list