<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/57246>57246</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Templates: Missing warning about implicitly deleted (defaulted) move constructor
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
pthurau
</td>
</tr>
</table>
<pre>
A templated class
- with explicitly defaulted move constructor
- a member which is neither movable nor copyable
is missing the note that the move constructor was implicitly deleted.
Minimal example:
```
#include <utility>
struct OnlyCreatable
{
OnlyCreatable() = default;
OnlyCreatable( const OnlyCreatable & ) = delete;
OnlyCreatable( OnlyCreatable && ) = delete;
};
template< typename T = int >
struct WithMember
{
WithMember() = default;
WithMember( WithMember && ) = default;
OnlyCreatable _;
};
int main()
{
WithMember m;
auto moved = std::move( m );
}
```
Output:
```
<source>:22:10: error: call to implicitly-deleted copy constructor of 'typename std::remove_reference<WithMember<> &>::type' (aka 'WithMember<>')
auto moved = std::move( m );
^ ~~~~~~~~~~~~~~
<source>:14:5: note: copy constructor is implicitly deleted because 'WithMember<>' has a user-declared move constructor
WithMember( WithMember && ) = default;
^
1 error generated.
Execution build compiler returned: 1
```
GCC correctly reports the note:
```
<source>: In function 'int main()':
<source>:22:31: error: use of deleted function 'WithMember::WithMember(WithMember&&)'
22 | auto moved = std::move( m );
| ^
<source>:14:5: note: 'WithMember::WithMember(WithMember&&)' is implicitly deleted because the default definition would be ill-formed:
14 | WithMember( WithMember && ) = default;
| ^~~~~~~~~~
<source>:14:5: error: use of deleted function 'OnlyCreatable::OnlyCreatable(OnlyCreatable&&)'
<source>:7:5: note: declared here
7 | OnlyCreatable( OnlyCreatable && ) = delete;
| ^~~~~~~~~~~~~
Compiler returned: 1
```
Clang also prints the note if the class is NOT a template:
```
<source>:14:5: error: explicitly defaulted move constructor is implicitly deleted [-Werror,-Wdefaulted-function-deleted]
WithMember( WithMember && ) = default;
^
<source>:16:19: note: move constructor of 'WithMember' is implicitly deleted because field '_' has a deleted move constructor
OnlyCreatable _;
^
<source>:7:5: note: 'OnlyCreatable' has been explicitly marked deleted here
OnlyCreatable( OnlyCreatable && ) = delete;
^
<source>:22:10: error: call to implicitly-deleted copy constructor of 'typename std::remove_reference<WithMember &>::type' (aka 'WithMember')
auto moved = std::move( m );
^ ~~~~~~~~~~~~~~
<source>:14:5: note: copy constructor is implicitly deleted because 'WithMember' has a user-declared move constructor
WithMember( WithMember && ) = default;
^
2 errors generated.
```
Live example: https://godbolt.org/z/6vrT5dvh5 ( comment out line 10 ( "template..." ) to get the note
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzdV0tv4zgM_jXOhUjgR2wnBx86bmexwHZ7KdBjIdtMoh35AVluJvvrl7LjZx5N2wEG2MCRLVmiyI8fKTrKk0NwBwrTQjCFCcSClSUY5r1h3s1hz9UO8GcheMyVOECCG1YJPS_N3xDiPCuVrGKVy3YFgxTTCCXsdzzeAS8hQxJCA7SCRQIhyyUtLA6606xqWpqa8rLk2RZoPk1TSA9M1b3pdrBnJfB0oJhAUmsxFPjIM54yQfozmoiGcxw3PPN4NV3b4VksqgTBcMJKccHVwXAehqKabeEpE4dQIlMD3f1vzQPQb_zeXhn2mmTet7AZzpW5jXXjYTBsD3oh2sTrMk5WXxFg-Pf9c922LCAYQB0KzFiK8Fyv5ZmCDpMjGi_k18fa2WegGLy8jsNo4qB3qv3p2gtIwOsVI7UlKeNZo9ZVzSEd7cYqlddETGqFSpVoSjl3ekjrnmpdRzufpVvdPlWqqNRFSjphmVcyRg25c2fb1FgmNYBSUqzRQ8yEANKnj4H5MQbq4BrFSr4hzfzOo53iErXqrxI3KDHTu4UDbzgh7V57oVaCLi2BBNHYiv1gWuZ0Og11oH4cMmh_hvvQPvkPt17nkLOW1LgaL51Oatym4PBzeQQijFlV4gUbYUfZhwFNkIQ6pUx5MSN-meLu0TKr8T1sMUPJ-lz38BNjSlp5BlHFhfZ-WnBBwiWqSmaoEQfrChX_CENaJCXGGgCJRS5V2aXgGykKf2awqbK4VoQQmkQZ0aKTc4bbjjXitgaeONv6Yih36AxNpBG0w45XX_XOLZa2TXQK4bO8bNde_nW-epeFn7PkHa5qlx0ppO90-tWo7fNK6EnAhZhvcpnWlOgss5adZV_haY-PRuHTYXoLB8anXg3e9CCc9KdkmGzvT93TxTTVLdjb6Hc2fung_RBcY9zCjwZ3KBjVU0yUORSSgrIPbOCb-rkp-IhZfz89U07ra4Cb4v6M524qFy9Q2XC_zV8aSXY4f-nWz1v_t4ec4d7_4vw6NczTzXrIihMbmnN1uPt7IbrhSLFI8177U6Sdc_n8uFTc3J6BThh-EkZHdSLEbOjBlMkfpFur4zgevhwFl9T9LQXP7aXO_7vI-T3ljd14ujypb86mtab9i5NK_dcd7JQqSo29_Z2ubZ5EuVCLXG6p9y_9vTf57CZvOxea7600RSpT8kqB4BmCZdbjhm23SXCxWBi6aiADyMVbVF32nGFgeZ65NteW78-SwEnWzprNFOGLwfNxudYFHo_ftHsmM31nkd7wXO6zV12-0ztOAZ9VUgQTEwnrKlqQJdQR4q29zQuZ_0P1HHVp94oUsb-7vr30ZrtgHWHkWitmLV3HjGM3WToeS5iX2Bt_ZXvrmWARijKgVExJdsYD27Rtc2WtLctZO_4iWdnMsaIoWpq4XFLlRneq9MRCb6zBnsmg1iGqtiW9FLxUZf-SDhu-zRBb-RQ8u1wGBRkiWTWr1Q1qXf8Dd4Lotg">