<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/80617>80617</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            clang-tidy: readability-simplify-boolean-expr does not work for sth like `if ((a = b) == true)`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang-tidy
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          e-kwsm
      </td>
    </tr>
</table>

<pre>
    Prepare `/tmp/a.cpp`:

```cpp
void readability_simplify_boolean_expr() {
 bool b;
  auto pred = []() -> bool { return false; };
  if ((b = pred()) != true) {
  }
}

template <typename T> void readability_simplify_boolean_expr(T &&pred) {
  bool b;
  if ((b = pred()) == false) {
  }
  do {
  } while ((b = pred()) == true);
}
```

and `/tmp/compile_commands.json`:

```json
[ { "directory": "/tmp", "command": "clang++ -std=c++11 -c -o a.o a.cpp", "file": "a.cpp", "output": "a.o" } ]
```

clang-tidy fe94ae83ecf356fd2d63b7cd15f37aaafdbc14ef fixes the file as follows:

```
3 warnings generated.
a.cpp:4:23: warning: redundant boolean literal supplied to boolean operator [readability-simplify-boolean-expr]
    4 |   if ((b = pred()) != true) {
      |        ~~~~~~~~~~~~~~~^~~~
      |        !(b = pred())
a.cpp:4:8: note: FIX-IT applied suggested code changes
    4 | if ((b = pred()) != true) {
      |        ^
a.cpp:10:23: warning: redundant boolean literal supplied to boolean operator [readability-simplify-boolean-expr]
   10 |   if ((b = pred()) == false) {
      |        ~~~~~~~~~~~~~~~^~~~~
      | !static_cast<bool>(b = pred())
a.cpp:10:8: note: FIX-IT applied suggested code changes
   10 |   if ((b = pred()) == false) {
      | ^
a.cpp:13:28: warning: redundant boolean literal supplied to boolean operator [readability-simplify-boolean-expr]
   13 |   } while ((b = pred()) == true);
      |             ~~~~~~~~~~~~~~~^~~~
      | static_cast<bool>(b = pred())
a.cpp:13:13: note: FIX-IT applied suggested code changes
   13 |   } while ((b = pred()) == true);
 |             ^
clang-tidy applied 3 of 3 suggested fixes.
```

which results in:

```cpp
void readability_simplify_boolean_expr() {
  bool b;
  auto pred = []() -> bool { return false; };
  if ((!(b = pred())) {
 }
}

template <typename T> void readability_simplify_boolean_expr(T &&pred) {
  bool b;
  if ((!static_cast<bool>(b = pred())) {
  }
 do {
  } while ((static_cast<bool>(b = pred()));
}
```

Here `(`&rsquo;s are not removed; it should be:

```diff
@@ -3,3 +3,3 @@
   auto pred = []() -> bool { return false; };
-  if ((b = pred()) != true) {
+  if (!(b = pred())) {
   }
@@ -9,6 +9,6 @@
   bool b;
-  if ((b = pred()) == false) {
+  if (!(b = static_cast<bool>(pred()))) {
   }
   do {
-  } while ((b = pred()) == true);
+  } while ((b = static_cast<bool>(pred())));
 }
```

https://godbolt.org/z/3zaPxxoT4
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMV01zozgQ_TXypQsXSIDtgw9xHNfObQ457C0lUGNrRiBWEuN4DvvbtySw448448lkapZKZJDo1ut-T1LDrZXrBnFOsgXJliPeuY02c4y-bm09KrTYzT8bbLlBIHlM6MrVLaErPi7b1newOxIvSbxv87j_86Oh55uWAgxywQuppNs9WVm3Sla7p0Jrhbx5wufWEDoldAZksuitwA9CQdj-GXjnNLQGBRC2hB7sYBUR9tAbkMkCDLrONFBxZZGwBZDJ8siNrCBYTYvgxzvsvYTpaeI7nenwFE1w0gd4uAmtw7pV3CEQdu92LTa8Rnj0eG6O-xEIzQnNeygns14k4W30bOk7-8CvwAcQ-mwAthup8Md-h6wc0LxkYs_5cWJ4I070Uuq6lQqfSl3XvBF2_MXq5g39hOG-K1sEXgmlQhosnTY7Qilhd75rPwEl9N4_D_5fXigVb9aELghdQGSdIGxZ9o9JAlEJkQY-9v9esQc3lVT44uNsUHeu7dzxsCaUhlx6UV5PSsASOSl2UOEs5ThlWFYsyytBRc6KSSmSrGITznklijJJsYJKPqMFt0HwmIBbqLRSemuvZa5_ZLDlppHN2sIaGzTcoRgP1IRo2F1K2B1lPobhVX9rUHSN4I2DQaagpEPDFdiubZVEAU4fxnTrPWvj1-OR1qO91qPhxShoPTuIECAFMrmHd69Hf_UOwvXv6UWyB9--_q53-up0l9mZ-ow02qH_XX36O_r0CHzIgu3Wa7QOBZRaIJQb3qzRngf4MeGR7OEUXBL_Qe6S-Cburu9Gt5B3wR6hiXXcyfKp5NYRdu_hEfZwC5chXb9A5odFfEmk55BO_xCRbAjrF06BCzZvX4_vp5Ptm_fy-RGBn8d84PZol9_jYaArYEewwq4-fuOo2G5kuQGDtlPOgmx-V531-wut6_vtCZD_W4X1k_vNtXrr7XLr52a4sfT6C_e1-jS0ubH_dJqwhQVfxTfagcFaf0PhWZMO7EZ3SkCB10QmZFUNXWlM0hgiRug9A0IXw03oPqyvD5FQ9M7iwBd6B8ubpHdc3g_xzQi9z318w81pfGeq-SHSawfDFajXVHGhh2tRwGmZH_1ane9Bvm7_E0CP9823xLtxrg2lLV0RulprUWjlxtqsCV19J3TFvvPPz8_6MR2JORMzNuMjnCeTeBJP45hNRps5p7NKJJgXGS3z6SyZzaZZWhZ5Mit4UiGO5JzGNI1pnNI4Y9lknPAc86ysphlLOOOUpDHWXKqxUt9qP_dIWtvhfBrnyWSkeIHKhs_l4esi7PX-cyBbjszcG0VFt7YkjZW0zr64cdIpnB_ZhLP-Byc2CI02rNqtNl-h0gas24CSX8MqPyiPB0qKV5jM41Fn1PwstdJtumJc6prQlUc4_ESt0V-wdISuQtSW0FUI_L8AAAD__6aRbz0">