<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/116055>116055</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang-tidy] Using an aliased name of a class for its copy/move/assignment constructors/operators produces a false positive `cppcoreguidelines-special-member-functions` warning.
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang-tidy
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
crud89
</td>
</tr>
</table>
<pre>
The following class produces a false positive Wcppcoreguidelines-special-member-functions with LLVM 19.1.3:
```cxx
template <typename T, unsigned ROWS, unsigned COLS> requires (ROWS >= 2 && COLS >= 2)
class Mat {
public:
static constexpr size_t mat_rows = ROWS;
static constexpr size_t mat_cols = COLS;
using scalar_type = T;
using mat_type = Mat<scalar_type, mat_rows, mat_cols>;
protected:
using array_type = std::array<scalar_type, mat_rows* mat_cols>;
private:
array_type m_elements = { };
public:
constexpr Mat() noexcept = default;
constexpr Mat(const mat_type& _other) noexcept {
std::ranges::copy(_other.m_elements, std::begin(m_elements));
}
constexpr Mat(mat_type&& _other) noexcept :
m_elements{ std::move(_other.m_elements) } {
}
virtual ~Mat() noexcept = default;
constexpr auto& operator=(const mat_type& _other) noexcept {
std::ranges::copy(_other.m_elements, std::begin(m_elements));
return *this;
}
constexpr auto& operator=(mat_type&& _other) noexcept {
m_elements = std::move(_other.m_elements);
return *this;
}
};
```
This happens due to the alias `using mat_type = Mat<scalar_type, mat_rows, mat_cols>;`. If I replace the alias `mat_type` in the constructors and assignment operators with the full class name, the warning goes away.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVk9vozgU_zTO5SkRmISEA4emmUgjTTXSTnfnWBnzAK8MZu3ntNnDfvaVIU1IO1NFoz2shAIx78_vD-YhnFN1h5iz1ZatdjPhqTE2l9aXm2xWmPKYPzYIldHaPKuuBqmFc9BbU3qJDgRUQjuE3jhF6oDwXfa9NBZrr0rUqkM3dz1KJfS8xbZAO698J0mZzsGzoga-fPnjAeJsES8SltyxaMei1980Gg_58jKuELa9FoTAkns69tiJFuGR8Xvw3cCjhN--fv92tXD_9cs3lnwCi395ZdEB45sQBCz5xJIdcGA8ZTwdAs-LjGdjy5HvgyBg6-241PtCKzkBmzkSpCRI0znCl96CU3_jE0Er6MmaZweh5oAs2d6UJI0ek0b02ytZosy7YIWTQgv7FIQYYh-n1ceQUOt8_0EQS-4nWUGnV4iv16HzIMJVz94aQklYTlmPLYS14nhp4miISe6G9Y_63X3YTx0E4bTbpE_7hBpb7GjUiK23wNa7tyXeuXRROijBN4xn0Bl8kdjTUKjESnhN7_V-mzn8P4sbHp4nQw3a64rrixuD3SdhrOhqdOO1NP2R8c2YvbjwCkqdEwqsVcf4Zno7C8fE7sD_Y8wTtD8DPNGKRdmk3Xp7QdOaA_4YchZcuKb9DtVBWfJCwz-_boHwZAID06MVZCxLdv9PS6LMInnbAeN31Ch3q18_JniDf9fs3uySWwz8BfjTfff6vp4ye2yUg0b0PXYOSo9ABqhBEFoJByyN_oMXVRot4HMFn8Fir4XE6wZn4dIIVDfcG7S2XpKxDkRXwjgGgwxn1U_jKYRXXuvT4AsTJyAIy8_CdgF7bcIgfBbHxazMkzJLMjHDPF4n8SpK01U2a_JlkaVpVRbJplqFUxHF60SILN1UiZTVcqZyHvFlHMdJvIyW8WrBk00cy3WWodxIzDhbRtgKpRdaH9qFsfVMOecxj-M0Wq1mWhSo3TDFOZdadPWcVHlknIepbvOQNS987dgy0sqRu9QhRXqY_5O01Q5-H9_u3SgklgN1MBWIkxSVsaDIwbhh9uNjtZ8oOVWZ8f1F2J9_PYRhf_P3QzD05MFi5q3OG6J-2MV8z_i-VtT4YiFNy_g-sD2d5r01f6IkxveDhAHbScVDzv8NAAD___-k1a8">