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;{{$}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits