forked from OSchip/llvm-project
87 lines
3.7 KiB
ReStructuredText
87 lines
3.7 KiB
ReStructuredText
.. title:: clang-tidy - readability-simplify-boolean-expr
|
|
|
|
readability-simplify-boolean-expr
|
|
=================================
|
|
|
|
Looks for boolean expressions involving boolean constants and simplifies
|
|
them to use the appropriate boolean expression directly.
|
|
|
|
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 pointers, including pointers to members, to
|
|
``bool`` are replaced with explicit comparisons to ``nullptr`` in C++11
|
|
or ``NULL`` in C++98/03.
|
|
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
|
|
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 = (i & 1) != 0;``.
|
|
|
|
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;``
|
|
|
|
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);``
|
|
|
|
Options
|
|
-------
|
|
|
|
.. option:: ChainedConditionalReturn
|
|
|
|
If non-zero, conditional boolean return statements at the end of an
|
|
``if/else if`` chain will be transformed. Default is `0`.
|
|
|
|
.. option:: ChainedConditionalAssignment
|
|
|
|
If non-zero, conditional boolean assignments at the end of an ``if/else
|
|
if`` chain will be transformed. Default is `0`.
|