<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/145415>145415</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang-tidy] `misc-redundant-expression` false positive with type aliases of the same type
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang-tidy,
false-positive
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
cai-lw
</td>
</tr>
</table>
<pre>
To reproduce:
```c++
#include <array>
#include <tuple>
using MonthArray = std::array<int, 12>;
using ZodiacArray = std::array<int, 12>;
static_assert(std::tuple_size<MonthArray>::value == std::tuple_size<ZodiacArray>::value);
static_assert(std::tuple_size_v<MonthArray> == std::tuple_size_v<ZodiacArray>);
```
Output:
```
<source>:7:50: warning: both sides of operator are equivalent [misc-redundant-expression]
7 | static_assert(std::tuple_size<MonthArray>::value == std::tuple_size<ZodiacArray>::value);
| ^
<source>:8:45: warning: both sides of operator are equivalent [misc-redundant-expression]
8 | static_assert(std::tuple_size_v<MonthArray> == std::tuple_size_v<ZodiacArray>);
| ^
2 warnings generated.
```
In reality `MonthArray` and `ZodiacArray` may be defined far away from each other, or even in completely unrelated modules. When we happen to use `MonthArray` and `ZodiacArray` together, a reader without enough context is likely unaware that they are the same type, and we want to use a `static_assert` to remind the reader that they do have the same `value`. (We could also use `std::same_as<MonthArray, ZodiacArray>` but sometimes we only care about their lengths in the surrounding code)
In this case comparing `MonthArray` and `ZodiacArray` shouldn't be redundant. Such expressions should only be redundant if the two types are spelled in exactly the same way.
There has been a similar issue https://github.com/llvm/llvm-project/issues/118885 where the final resolution was that comparing different macros expanding to the same constant is non-redundant. This issue is in principal similar, but regarding to type aliases instead of macros.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzEls1u6zYThq-G3gxs0JQlOwsvFOcE-BYfuugBDtBNMCLHFluKVPljR736glL8e9AiRVs0EBBZ4sw8M-9LQhiCPliiLSufWfkywxRb57cS9dycZo1Tw_arA0-9dypJYkXNeM0qPl2Sied88ZqJQltpkiJgxQ69x4EVX757EVNv6OMFr1PQ9gD_dza2dY4AVrxAiCpXKeqPJDttIxM7WIocVzxf4n5ySqP8S4GM1yFi1PINQyAfmdhcoka0t6B_I1bsrkxjbH5_RJNyDy93te6ibojuw5h4mgA-Uf3t-Fj_T4qOix_KnmtdVGK8_iHFPsUH9fJ9sQsueUkT75oVdclZUcMJvdX2kG8bF1sIWlEAtwfXk8foPKAnoF-TPqIhG4GVz50Ocu5JJavQxjm9955C0M6y8oXxGtbA1jv4bwWA8S9zsPLL9wPYsKJelf_WAABg89kZ_GM2eOxYnFsLcCCbeyG1eLQFr_9nwRMaHQdgFb8BqTigVfnhbcGKQ4cDNASK9tqSgj16wBMOsPeuA0LZgost-bwlnQc6kgVtQbquNxTJDJCsJ5NxoHMqGQoL-NaShRNBi31PFqKDFOizQNEd6FwRczeKPJx0bF2KQNalQwvS2UjvEXQAo3-ZKPCUpY0tRogtDTD9IgjYEcShpzGhVRnshDaesTAz3Es7UoCnTls15viguCZXDlo83hRgFZ8sW_EFMLH5RiBdMgrQhEv7Fw_kkDcM914RO3gwQ8WhSRGC6yjqjkJGd9YMIHNz2OSJxJa0B0P2ENuQpRmRkvcuWZUPXOlU3khwMUhsdQCJgUYV0edFn9QmtLkny8Q6ZtNcNs0CfkyyhevWCR9LJ9zbpaD3I2I8uVGVMAoVejKGVOand5TRDNfRnnBYTPBfW_LZVQEaIgsIQXfaoAcdQiJoY-xDHrB4ZeL1oGObmoV0HROvxhzP_-a9dz-TjEy8jmGBidflcrPZlHAa8-fCe23RgKfgTIraWThhmOS_zkzp_Z58PkQ6lN6F3D5OM4_uii-dDXFsPIB1dn4ztK9ZiYldj9r1XlupezTnzrIpsgU8HdBfUg89ARqNgXJUiIQqn3ETxmKmtoV6Kp5wRtvluuTrZSXW5azd4n65lnxVLJ-QVpWs1NOqqZabZVmSappNNdNbwUXJK1EIwVdFucAn3lS8WG0K1RRSrtmKU4faLPIgF84fZiP9drkqV8tyZrAhE8aPEiGkQXuYR60GJgQTOybEHk2gee-CjvpI-XH5MvPbUZUmHQJbcaNDDNf0UUczfuXcZCtfsjP_-NSuOIyF4FxoPD3up-b292fDLHmz_Rv-mfo_bsXvAQAA___UcSix">