<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">