Add some test cases for macros and constexpr functions.
Re-enable some temporarily commented out checking on other test cases.


http://reviews.llvm.org/D7648

Files:
  clang-tidy/readability/CMakeLists.txt
  clang-tidy/readability/ReadabilityTidyModule.cpp
  clang-tidy/readability/SimplifyBooleanExpr.cpp
  clang-tidy/readability/SimplifyBooleanExpr.h
  test/clang-tidy/readability-simplify-bool-expr.cpp

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
Index: clang-tidy/readability/CMakeLists.txt
===================================================================
--- clang-tidy/readability/CMakeLists.txt
+++ clang-tidy/readability/CMakeLists.txt
@@ -9,6 +9,7 @@
   ReadabilityTidyModule.cpp
   RedundantSmartptrGet.cpp
   ShrinkToFitCheck.cpp
+  SimplifyBooleanExpr.cpp
 
   LINK_LIBS
   clangAST
Index: clang-tidy/readability/ReadabilityTidyModule.cpp
===================================================================
--- clang-tidy/readability/ReadabilityTidyModule.cpp
+++ clang-tidy/readability/ReadabilityTidyModule.cpp
@@ -16,6 +16,7 @@
 #include "FunctionSize.h"
 #include "RedundantSmartptrGet.h"
 #include "ShrinkToFitCheck.h"
+#include "SimplifyBooleanExpr.h"
 
 namespace clang {
 namespace tidy {
@@ -36,6 +37,8 @@
         "readability-redundant-smartptr-get");
     CheckFactories.registerCheck<ShrinkToFitCheck>(
         "readability-shrink-to-fit");
+    CheckFactories.registerCheck<SimplifyBooleanExpr>(
+        "readability-simplify-boolean-expr");
   }
 };
 
Index: clang-tidy/readability/SimplifyBooleanExpr.cpp
===================================================================
--- /dev/null
+++ clang-tidy/readability/SimplifyBooleanExpr.cpp
@@ -0,0 +1,328 @@
+//===--- SimplifyBooleanExpr.cpp clang-tidy ---------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "SimplifyBooleanExpr.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+#include "clang/Lex/Lexer.h"
+
+#include <string>
+
+using namespace clang;
+using namespace clang::ast_matchers;
+
+namespace {
+
+inline std::string getText(
+        const ast_matchers::MatchFinder::MatchResult &Result,
+        SourceRange Range) {
+    return Lexer::getSourceText(
+            CharSourceRange::getTokenRange(Range),
+            *Result.SourceManager, Result.Context->getLangOpts());
+}
+
+template <typename T>
+std::string getText(const ast_matchers::MatchFinder::MatchResult &Result, T &Node) {
+    return getText(Result, Node.getSourceRange());
+}
+
+char const *const LeftBooleanLiteralId = "bool-op-expr-yields-bool";
+char const *const RightExpressionId = "bool-op-expr-yields-expr";
+char const *const RightBooleanLiteralId = "expr-op-bool-yields-bool";
+char const *const LeftExpressionId = "expr-op-bool-yields-expr";
+char const *const NegatedRightExpressionId = "bool-op-expr-yields-not-expr";
+char const *const NegatedLeftExpressionId = "expr-op-bool-yields-not-expr";
+char const *const ConditionThenStmtId = "if-bool-yields-then";
+char const *const ConditionElseStmtId = "if-bool-yields-else";
+char const *const TernaryId = "ternary-bool-yields-condition";
+char const *const TernaryNegatedId = "ternary-bool-yields-not-condition";
+
+char const *const IfStmtId = "if";
+char const *const ExpressionId = "expr";
+
+char const *const SimplifyDiagnostic = "Redundant boolean constant supplied to boolean operator.";
+char const *const SimplifyConditionDiagnostic = "Redundant boolean constant in if statement condition.";
+
+inline CXXBoolLiteralExpr const *getBoolLiteral(
+        const BoundNodes &Nodes,
+        const char *const FirstId)
+{
+    return Nodes.getNodeAs<CXXBoolLiteralExpr>(FirstId);
+}
+
+inline CXXBoolLiteralExpr const *getLeftRemoved(MatchFinder::MatchResult const &Result)
+{
+    return getBoolLiteral(Result.Nodes, RightExpressionId);
+}
+
+inline CXXBoolLiteralExpr const *getLeftReplacing(MatchFinder::MatchResult const &Result)
+{
+    return getBoolLiteral(Result.Nodes, LeftBooleanLiteralId);
+}
+
+inline CXXBoolLiteralExpr const *getRightReplacing(MatchFinder::MatchResult const &Result)
+{
+    return getBoolLiteral(Result.Nodes, RightBooleanLiteralId);
+}
+
+inline CXXBoolLiteralExpr const *getRightRemoved(MatchFinder::MatchResult const &Result)
+{
+    return getBoolLiteral(Result.Nodes, LeftExpressionId);
+}
+
+inline CXXBoolLiteralExpr const *getNegatedLeftRemoved(MatchFinder::MatchResult const &Result)
+{
+    return getBoolLiteral(Result.Nodes, NegatedRightExpressionId);
+}
+
+inline CXXBoolLiteralExpr const *getNegatedRightRemoved(MatchFinder::MatchResult const &Result)
+{
+    return getBoolLiteral(Result.Nodes, NegatedLeftExpressionId);
+}
+
+inline CXXBoolLiteralExpr const *getTrueConditionRemoved(MatchFinder::MatchResult const &Result)
+{
+    return getBoolLiteral(Result.Nodes, ConditionThenStmtId);
+}
+
+inline CXXBoolLiteralExpr const *getFalseConditionRemoved(MatchFinder::MatchResult const &Result)
+{
+    return getBoolLiteral(Result.Nodes, ConditionElseStmtId);
+}
+
+} // namespace
+
+namespace clang {
+namespace tidy {
+namespace readability {
+
+void SimplifyBooleanExpr::matchBoolBinOpExpr(
+        ast_matchers::MatchFinder *Finder,
+        bool Value,
+        char const *const OperatorName,
+        char const *const BooleanId) {
+    Finder->addMatcher(
+        binaryOperator(
+            isExpansionInMainFile(),
+            hasOperatorName(OperatorName),
+            hasLHS(boolLiteral(equals(Value)).bind(BooleanId)),
+            hasRHS(expr().bind(ExpressionId)),
+            unless(hasRHS(hasDescendant(boolLiteral())))
+        ), this);
+}
+
+void SimplifyBooleanExpr::matchExprBinOpBool(
+        ast_matchers::MatchFinder *Finder,
+        bool Value,
+        char const *const OperatorName,
+        char const *const BooleanId) {
+    Finder->addMatcher(
+        binaryOperator(
+            isExpansionInMainFile(),
+            hasOperatorName(OperatorName),
+            hasLHS(expr().bind(ExpressionId)),
+            unless(hasLHS(boolLiteral())),
+            unless(hasLHS(hasDescendant(boolLiteral()))),
+            hasRHS(boolLiteral(equals(Value)).bind(BooleanId))
+        ), this);
+}
+
+void SimplifyBooleanExpr::matchBoolCompOpExpr(
+        ast_matchers::MatchFinder *Finder,
+        bool Value,
+        char const *const OperatorName,
+        char const *const BooleanId) {
+    Finder->addMatcher(
+        binaryOperator(
+            isExpansionInMainFile(),
+            hasOperatorName(OperatorName),
+            hasLHS(hasDescendant(boolLiteral(equals(Value)).bind(BooleanId))),
+            hasRHS(expr().bind(ExpressionId)),
+            unless(hasRHS(hasDescendant(boolLiteral())))
+        ), this);
+}
+
+void SimplifyBooleanExpr::matchExprCompOpBool(
+        ast_matchers::MatchFinder *Finder,
+        bool Value,
+        char const *const OperatorName,
+        char const *const BooleanId) {
+    Finder->addMatcher(
+        binaryOperator(
+            isExpansionInMainFile(),
+            hasOperatorName(OperatorName),
+            hasLHS(expr().bind(ExpressionId)),
+            unless(hasLHS(boolLiteral())),
+            unless(hasLHS(hasDescendant(boolLiteral()))),
+            hasRHS(hasDescendant(boolLiteral(equals(Value)).bind(BooleanId)))
+        ), this);
+}
+
+void SimplifyBooleanExpr::matchBoolCondition(
+        ast_matchers::MatchFinder *Finder,
+        bool Value,
+        char const *const BooleanId) {
+    Finder->addMatcher(
+        ifStmt(
+            isExpansionInMainFile(),
+            hasCondition(boolLiteral(equals(Value)).bind(BooleanId))
+        ).bind(IfStmtId), this);
+}
+
+void SimplifyBooleanExpr::matchTernaryResult(
+        ast_matchers::MatchFinder *Finder,
+        bool Value,
+        char const *const TernaryId) {
+    Finder->addMatcher(
+            conditionalOperator(
+                    isExpansionInMainFile(),
+                    hasTrueExpression(boolLiteral(equals(Value))),
+                    hasFalseExpression(boolLiteral(equals(!Value)))
+            ).bind(TernaryId), this);
+}
+
+void SimplifyBooleanExpr::registerMatchers(ast_matchers::MatchFinder *Finder)
+{
+    matchBoolBinOpExpr(Finder, true, "&&", RightExpressionId);
+    matchBoolBinOpExpr(Finder, false, "||", RightExpressionId);
+    matchBoolCompOpExpr(Finder, true, "==", RightExpressionId);
+    matchBoolCompOpExpr(Finder, false, "!=", RightExpressionId);
+
+    matchBoolBinOpExpr(Finder, false, "&&", LeftBooleanLiteralId);
+    matchBoolBinOpExpr(Finder, true, "||", LeftBooleanLiteralId);
+
+    matchExprBinOpBool(Finder, false, "&&", RightBooleanLiteralId);
+    matchExprBinOpBool(Finder, true, "||", RightBooleanLiteralId);
+
+    matchExprBinOpBool(Finder, true, "&&", LeftExpressionId);
+    matchExprBinOpBool(Finder, false, "||", LeftExpressionId);
+    matchExprCompOpBool(Finder, true, "==", LeftExpressionId);
+    matchExprCompOpBool(Finder, false, "!=", LeftExpressionId);
+
+    matchBoolCompOpExpr(Finder, false, "==", NegatedRightExpressionId);
+    matchBoolCompOpExpr(Finder, true, "!=", NegatedRightExpressionId);
+
+    matchExprCompOpBool(Finder, false, "==", NegatedLeftExpressionId);
+    matchExprCompOpBool(Finder, true, "!=", NegatedLeftExpressionId);
+
+    matchBoolCondition(Finder, true, ConditionThenStmtId);
+    matchBoolCondition(Finder, false, ConditionElseStmtId);
+
+    matchTernaryResult(Finder, true, TernaryId);
+    matchTernaryResult(Finder, false, TernaryNegatedId);
+}
+
+void SimplifyBooleanExpr::check(const ast_matchers::MatchFinder::MatchResult &Result)
+{
+    if (auto LeftRemoved = getLeftRemoved(Result)) {
+        replaceWithRightExpression(Result, LeftRemoved);
+    } else if (auto LeftReplacing = getLeftReplacing(Result)) {
+        replaceWithLeftBooleanLiteral(Result, LeftReplacing);
+    } else if (auto RightReplacing = getRightReplacing(Result)) {
+        replaceWithRightBooleanLiteral(Result, RightReplacing);
+    } else if (auto RightRemoved = getRightRemoved(Result)) {
+        replaceWithLeftExpression(Result, RightRemoved);
+    } else if (auto NegatedLeftRemoved = getNegatedLeftRemoved(Result)) {
+        replaceWithRightExpression(Result, NegatedLeftRemoved, "!");
+    } else if (auto NegatedRightRemoved = getNegatedRightRemoved(Result)) {
+        replaceWithLeftExpression(Result, NegatedRightRemoved, "!");
+    } else if (auto TrueConditionRemoved = getTrueConditionRemoved(Result)) {
+        replaceWithThenStatement(Result, TrueConditionRemoved);
+    } else if (auto FalseConditionRemoved = getFalseConditionRemoved(Result)) {
+        replaceWithElseStatement(Result, FalseConditionRemoved);
+    } else if (auto Ternary = Result.Nodes.getNodeAs<ConditionalOperator>(TernaryId)) {
+        replaceWithCondition(Result, Ternary);
+    } else if (auto TernaryNegated = Result.Nodes.getNodeAs<ConditionalOperator>(TernaryNegatedId)) {
+        replaceWithCondition(Result, TernaryNegated, "!");
+    }
+}
+
+void SimplifyBooleanExpr::replaceWithRightExpression(
+        const ast_matchers::MatchFinder::MatchResult &Result,
+        Expr const *BoolLiteral,
+        std::string const Prefix)
+{
+    auto const *const Expression = Result.Nodes.getNodeAs<Expr>(ExpressionId);
+    diag(BoolLiteral->getLocStart(), SimplifyDiagnostic)
+        << FixItHint::CreateReplacement(
+            SourceRange(BoolLiteral->getLocStart(), Expression->getLocEnd()),
+            Prefix + getText(Result, *Expression));
+}
+
+void SimplifyBooleanExpr::replaceWithLeftBooleanLiteral(
+        const ast_matchers::MatchFinder::MatchResult &Result,
+        CXXBoolLiteralExpr const *BoolLiteral)
+{
+    auto const *const Expression = Result.Nodes.getNodeAs<Expr>(ExpressionId);
+    diag(BoolLiteral->getLocStart(), SimplifyDiagnostic)
+        << FixItHint::CreateReplacement(
+            SourceRange(BoolLiteral->getLocStart(), Expression->getLocEnd()),
+            getText(Result, *BoolLiteral));
+}
+
+void SimplifyBooleanExpr::replaceWithRightBooleanLiteral(
+        const ast_matchers::MatchFinder::MatchResult &Result,
+        CXXBoolLiteralExpr const *BoolLiteral)
+{
+    auto const *const Expression = Result.Nodes.getNodeAs<Expr>(ExpressionId);
+    diag(BoolLiteral->getLocStart(), SimplifyDiagnostic)
+        << FixItHint::CreateReplacement(
+            SourceRange(Expression->getLocStart(), BoolLiteral->getLocEnd()),
+            getText(Result, *BoolLiteral));
+}
+
+void SimplifyBooleanExpr::replaceWithLeftExpression(
+        const ast_matchers::MatchFinder::MatchResult &Result,
+        CXXBoolLiteralExpr const *BoolLiteral,
+        std::string const Prefix)
+{
+    auto const *const Expression = Result.Nodes.getNodeAs<Expr>(ExpressionId);
+    diag(BoolLiteral->getLocStart(), SimplifyDiagnostic)
+        << FixItHint::CreateReplacement(
+            SourceRange(Expression->getLocStart(), BoolLiteral->getLocEnd()),
+            Prefix + getText(Result, *Expression));
+}
+
+void SimplifyBooleanExpr::replaceWithThenStatement(
+        const ast_matchers::MatchFinder::MatchResult &Result,
+        CXXBoolLiteralExpr const *TrueConditionRemoved)
+{
+    auto const *const IfStatement = Result.Nodes.getNodeAs<IfStmt>(IfStmtId);
+    diag(TrueConditionRemoved->getLocStart(), SimplifyConditionDiagnostic)
+        << FixItHint::CreateReplacement(
+            IfStatement->getSourceRange(),
+            getText(Result, *IfStatement->getThen()));
+}
+
+void SimplifyBooleanExpr::replaceWithElseStatement(
+        const ast_matchers::MatchFinder::MatchResult &Result,
+        CXXBoolLiteralExpr const *FalseConditionRemoved)
+{
+    auto const *const IfStatement = Result.Nodes.getNodeAs<IfStmt>(IfStmtId);
+    auto const *const ElseStatement = IfStatement->getElse();
+    diag(FalseConditionRemoved->getLocStart(), SimplifyConditionDiagnostic)
+        << FixItHint::CreateReplacement(
+            IfStatement->getSourceRange(),
+            ElseStatement ? getText(Result, *ElseStatement) : "");
+}
+
+void SimplifyBooleanExpr::replaceWithCondition(
+        const ast_matchers::MatchFinder::MatchResult &Result,
+        ConditionalOperator const *Ternary,
+        std::string Prefix)
+{
+    diag(Ternary->getTrueExpr()->getLocStart(),
+            "Redundant boolean literal in ternary expression result.")
+        << FixItHint::CreateReplacement(
+            Ternary->getSourceRange(),
+            Prefix + getText(Result, *Ternary->getCond()));
+}
+
+} // namespace readability
+} // namespace tidy
+} // namespace clang
Index: clang-tidy/readability/SimplifyBooleanExpr.h
===================================================================
--- /dev/null
+++ clang-tidy/readability/SimplifyBooleanExpr.h
@@ -0,0 +1,103 @@
+//===--- SimplifyBooleanExpr.h clang-tidy -----------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_SIMPLIFY_BOOLEAN_EXPR_H
+#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_SIMPLIFY_BOOLEAN_EXPR_H
+
+#include "../ClangTidy.h"
+
+namespace clang {
+namespace tidy {
+namespace readability {
+
+/// \brief Replace copy and swap tricks on shrinkable containers with the
+/// \c shrink_to_fit() method call.
+///
+/// The \c shrink_to_fit() method is more readable and more effective than
+/// the copy and swap trick to reduce the capacity of a shrinkable container.
+/// Note that, the \c shrink_to_fit() method is only available in C++11 and up.
+class SimplifyBooleanExpr : public ClangTidyCheck {
+public:
+    SimplifyBooleanExpr(StringRef Name, ClangTidyContext *Context)
+            : ClangTidyCheck(Name, Context) {}
+    void registerMatchers(ast_matchers::MatchFinder *Finder) override;
+    void check(const ast_matchers::MatchFinder::MatchResult &Result) override;
+
+private:
+    void matchBoolBinOpExpr(
+            ast_matchers::MatchFinder *Finder,
+            bool Value,
+            char const *const OperatorName,
+            char const *const BooleanId);
+
+    void matchExprBinOpBool(
+            ast_matchers::MatchFinder *Finder,
+            bool Value,
+            char const *const OperatorName,
+            char const *const BooleanId);
+
+    void matchBoolCompOpExpr(
+            ast_matchers::MatchFinder *Finder,
+            bool Value,
+            char const *const OperatorName,
+            char const *const BooleanId);
+
+    void matchExprCompOpBool(
+            ast_matchers::MatchFinder *Finder,
+            bool Value,
+            char const *const OperatorName,
+            char const *const BooleanId);
+
+    void matchBoolCondition(
+            ast_matchers::MatchFinder *Finder,
+            bool Value,
+            char const *const BooleanId);
+
+    void matchTernaryResult(
+            ast_matchers::MatchFinder *Finder,
+            bool Value,
+            char const *const TernaryId);
+
+    void replaceWithRightExpression(
+            const ast_matchers::MatchFinder::MatchResult &Result,
+            Expr const *BoolLiteral,
+            std::string Prefix = "");
+
+    void replaceWithLeftBooleanLiteral(
+            const ast_matchers::MatchFinder::MatchResult &Result,
+            CXXBoolLiteralExpr const *BoolLiteral);
+
+    void replaceWithRightBooleanLiteral(
+            const ast_matchers::MatchFinder::MatchResult &Result,
+            CXXBoolLiteralExpr const *BoolLiteral);
+
+    void replaceWithLeftExpression(
+            const ast_matchers::MatchFinder::MatchResult &Result,
+            CXXBoolLiteralExpr const *BoolLiteral,
+            std::string Prefix = "");
+
+    void replaceWithThenStatement(
+            const ast_matchers::MatchFinder::MatchResult &Result,
+            CXXBoolLiteralExpr const *BoolLiteral);
+
+    void replaceWithElseStatement(
+            const ast_matchers::MatchFinder::MatchResult &Result,
+            CXXBoolLiteralExpr const *FalseConditionRemoved);
+
+    void replaceWithCondition(
+            const ast_matchers::MatchFinder::MatchResult &Result,
+            ConditionalOperator const *Ternary,
+            std::string Prefix = "");
+};
+
+} // namespace readability
+} // namespace tidy
+} // namespace clang
+
+#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_READABILITY_SIMPLIFY_BOOLEAN_EXPR_H
Index: test/clang-tidy/readability-simplify-bool-expr.cpp
===================================================================
--- /dev/null
+++ test/clang-tidy/readability-simplify-bool-expr.cpp
@@ -0,0 +1,303 @@
+// RUN: $(dirname %s)/check_clang_tidy.sh %s readability-simplify-boolean-expr %t
+// REQUIRES: shell
+
+bool a1 = false;
+
+//=-=-=-=-=-=-= operator ==
+bool aa = false == a1;
+// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+// CHECK-FIXES: {{^}}bool aa = !a1;{{$}}
+bool ab = true == a1;
+// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+// CHECK-FIXES: {{^}}bool ab = a1;{{$}}
+bool a2 = a1 == false;
+// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+// CHECK-FIXES: {{^}}bool a2 = !a1;{{$}}
+bool a3 = a1 == true;
+// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+// CHECK-FIXES: {{^}}bool a3 = a1;{{$}}
+
+//=-=-=-=-=-=-= operator !=
+bool n1 = a1 != false;
+// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+// CHECK-FIXES: {{^}}bool n1 = a1;{{$}}
+bool n2 = a1 != true;
+// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+// CHECK-FIXES: {{^}}bool n2 = !a1;{{$}}
+bool n3 = false != a1;
+// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+// CHECK-FIXES: {{^}}bool n3 = a1;{{$}}
+bool n4 = true != a1;
+// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+// CHECK-FIXES: {{^}}bool n4 = !a1;{{$}}
+
+//=-=-=-=-=-=-= operator ||
+bool a4 = a1 || false;
+// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+// CHECK-FIXES: {{^}}bool a4 = a1;{{$}}
+bool a5 = a1 || true;
+// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+// CHECK-FIXES: {{^}}bool a5 = true;{{$}}
+bool a6 = false || a1;
+// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+// CHECK-FIXES: {{^}}bool a6 = a1;{{$}}
+bool a7 = true || a1;
+// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+// CHECK-FIXES: {{^}}bool a7 = true;{{$}}
+
+//=-=-=-=-=-=-= operator &&
+bool a8 = a1 && false;
+// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+// X-CHECK-FIXES: {{^}}bool a8 = false;{{$}}
+bool a9 = a1 && true;
+// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+// CHECK-FIXES: {{^}}bool a9 = a1;{{$}}
+bool ac = false && a1;
+// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+// CHECK-FIXES: {{^}}bool ac = false;{{$}}
+bool ad = true && a1;
+// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+// CHECK-FIXES: {{^}}bool ad = a1;{{$}}
+
+void if_with_bool_literal_condition()
+{
+    int i = 0;
+    if (false) {
+        i = 1;
+    } else {
+        i = 2;
+    }
+    i = 3;
+    // CHECK-MESSAGES: :[[@LINE-6]]:9: warning: Redundant boolean constant in if statement condition. [readability-simplify-boolean-expr]
+    // CHECK-FIXES: {{^    }}int i = 0;{{$}}
+    // CHECK-FIXES-NEXT: {{^    }}{{{$}}
+    // CHECK-FIXES-NEXT: {{^        }}i = 2;{{$}}
+    // CHECK-FIXES-NEXT: {{^    }}}{{$}}
+    // CHECK-FIXES-NEXT: {{^    }}i = 3;{{$}}
+
+    i = 4;
+    if (true) {
+        i = 5;
+    } else {
+        i = 6;
+    }
+    i = 7;
+    // CHECK-MESSAGES: :[[@LINE-6]]:9: warning: Redundant boolean constant in if statement condition. [readability-simplify-boolean-expr]
+    // CHECK-FIXES: {{^    }}i = 4;{{$}}
+    // CHECK-FIXES-NEXT: {{^    }}{{{$}}
+    // CHECK-FIXES-NEXT: {{^        }}i = 5;{{$}}
+    // CHECK-FIXES-NEXT: {{^    }}}{{$}}
+    // CHECK-FIXES-NEXT: {{^    }}i = 7;{{$}}
+
+    i = 8;
+    if (false) {
+        i = 9;
+    }
+    i = 11;
+    // CHECK-MESSAGES: :[[@LINE-4]]:9: warning: Redundant boolean constant in if statement condition. [readability-simplify-boolean-expr]
+    // CHECK-FIXES: {{^    }}i = 8;{{$}}
+    // CHECK-FIXES-NEXT: {{^    $}}
+    // CHECK-FIXES-NEXT: {{^    }}i = 11;{{$}}
+}
+
+void operator_equals()
+{
+    int i = 0;
+    bool b1 = (i > 2);
+    if (b1 == true) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (b1) {{{$}}
+        i = 5;
+    } else {
+        i = 6;
+    }
+    bool b2 = (i > 4);
+    if (b2 == false) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (!b2) {{{$}}
+        i = 7;
+    } else {
+        i = 9;
+    }
+    bool b3 = (i > 6);
+    if (true == b3) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (b3) {{{$}}
+        i = 10;
+    } else {
+        i = 11;
+    }
+    bool b4 = (i > 8);
+    if (false == b4) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (!b4) {{{$}}
+        i = 12;
+    } else {
+        i = 13;
+    }
+}
+
+void operator_or()
+{
+    int i = 0;
+    bool b5 = (i > 10);
+    if (b5 || false) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (b5) {{{$}}
+        i = 14;
+    } else {
+        i = 15;
+    }
+    bool b6 = (i > 10);
+    if (b6 || true) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (true) {{{$}}
+        i = 16;
+    } else {
+        i = 17;
+    }
+    bool b7 = (i > 10);
+    if (false || b7) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // X-CHECK-FIXES: {{^    }}if (b4) {{{$}}
+        i = 18;
+    } else {
+        i = 19;
+    }
+    bool b8 = (i > 10);
+    if (true || b8) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // X-CHECK-FIXES: {{^    }}if (true) {{{$}}
+        i = 20;
+    } else {
+        i = 21;
+    }
+}
+
+void operator_and()
+{
+    int i = 0;
+    bool b9 = (i > 20);
+    if (b9 && false) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (false) {{{$}}
+        i = 22;
+    } else {
+        i = 23;
+    }
+    bool ba = (i > 20);
+    if (ba && true) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (ba) {{{$}}
+        i = 24;
+    } else {
+        i = 25;
+    }
+    bool bb = (i > 20);
+    if (false && bb) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (false) {{{$}}
+        i = 26;
+    } else {
+        i = 27;
+    }
+    bool bc = (i > 20);
+    if (true && bc) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (bc) {{{$}}
+        i = 28;
+    } else {
+        i = 29;
+    }
+}
+
+void ternary_operator()
+{
+    int i = 0;
+    bool bd = (i > 20) ? true : false;
+    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: Redundant boolean literal in ternary expression result. [readability-simplify-boolean-expr]
+    // CHECK-FIXES: {{^    }}bool bd = (i > 20);{{$}}
+    bool be = (i > 20) ? false : true;
+    // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: Redundant boolean literal in ternary expression result. [readability-simplify-boolean-expr]
+    // CHECK-FIXES: {{^    }}bool be = !(i > 20);{{$}}
+}
+
+void operator_not_equal()
+{
+    int i = 0;
+    bool bf = (i > 20);
+    if (false != bf) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (bf) {{{$}}
+        i = 30;
+    } else {
+        i = 31;
+    }
+    bool bg = (i > 20);
+    if (true != bg) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (!bg) {{{$}}
+        i = 32;
+    } else {
+        i = 33;
+    }
+    bool bh = (i > 20);
+    if (bh != false) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (bh) {{{$}}
+        i = 34;
+    } else {
+        i = 35;
+    }
+    bool bi = (i > 20);
+    if (bi != true) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (!bi) {{{$}}
+        i = 36;
+    } else {
+        i = 37;
+    }
+}
+
+void nested_booleans()
+{
+    if (false || (true || false)) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (false || (true)) {{{$}}
+    }
+    if (true && (true || false)) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (true && (true)) {{{$}}
+    }
+    if (false || (true && false)) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (false || (false)) {{{$}}
+    }
+    if (true && (true && false)) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (true && (false)) {{{$}}
+    }
+}
+
+static constexpr bool truthy()
+{
+    return true;
+}
+
+#define HAS_XYZ_FEATURE true
+
+void macros_and_constexprs()
+{
+    int i = 0;
+    bool b = (i == 0);
+    if (b && truthy()) {
+        i = 1;
+    }
+    i = 2;
+    if (b && HAS_XYZ_FEATURE) {
+        // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: Redundant boolean constant supplied to boolean operator. [readability-simplify-boolean-expr]
+        // CHECK-FIXES: {{^    }}if (b) {{{$}}
+        i = 3;
+    }
+    i = 4;
+}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to