<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/62559>62559</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
clang-16: Incorrect "must explicitly initialize the member" error in function-local class
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
vogelsgesang
</td>
</tr>
</table>
<pre>
See https://godbolt.org/z/zoxs4nae4 for a self-contained example.
Both gcc and clang-15 accept the code. clang-16 and clang-trunk reject it.
For
```
#include<memory>
class TypeErased {
public:
virtual ~TypeErased();
};
template <typename T, typename... Args>
std::unique_ptr<TypeErased> make_type_erased(Args&&... args) {
struct TypeErasureWrapper : public TypeErased {
T content;
TypeErasureWrapper(Args&&... args) : content{std::forward<Args>(args)...} {}
~TypeErasureWrapper() override {}
};
return std::make_unique<TypeErasureWrapper>(std::forward<Args>(args)...);
}
class NoDefaultConstructor {
public:
NoDefaultConstructor(int);
};
auto testNoDefaultConstructor() {
return make_type_erased<NoDefaultConstructor>(1);
}
```
The error message from clang-16 does not make sense to me:
```
<source>:12:7: error: constructor for 'TypeErasureWrapper' must explicitly initialize the member 'content' which does not have a default constructor
TypeErasureWrapper(Args&&... args) : content{std::forward<Args>(args)...} {}
^ ^
```
clang is complaining that we would not initialize `content`, but on the very same line we are actually initializing it.
The error does not occur if the class has a default constructor or if I define `TypeErasureWrapper` outside the function, as shown in https://godbolt.org/z/YYzhWPnKx
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzEVkuP4jgX_TVmc1VRYocEFiwoKKTWJ30aaUpq9aplnJvE046d8QOKWvRvH9k8h6Ifu4mqDMa5j3Pu8bW5c7LTiAsyfSbT9YQH3xu72JkOlevQcd1NtqY5LP5EhN770RG2JHRD6KYzzdYonxnbEbp5j__mzZWaYwmtscDBoWqfhNGeS40N4BsfRoUZydckXz4b30MnBHDdgFBcd0_FFLgQOHrwPYIwDWbnlermNW-D_gYW_0LhQfqTv-O4MfZ2Sqr89HecUia1UKFBwlYDDsYeCHu5NRCKOwevhxFfLHfYAKmfjyswhq2SIsI_zgFgJ60PXMH3qwGhM0LnhJ2sSL2-fk-jx2FU3CMQtvKHETUfEF4JXcF5lmUZLG3nLqk538SwbBm0_Dvg19FbwlY3MdkLDPwbfo0evuI5j-SDVoRW0SNPs_kNIADnbRD-AjdY_Gz5OKIFws6AH5ORnleIxUXtLxBPv3_w9-Ns2PLipH6-AG2N3XPbELY6E0FnJ5Msy0i9TqnU69uo3x-GjUHMDq2VDd4bfSwOAFj0wWq4pJKIPRJ_Q_pNjJTc72Z-J40Pyvu_WWPLg_Iro4_VMfbftN_L8JEFoTOp_c91eBx58AY8Ov8DN_eKOdPzQW5s9dBDwl88hn23N9P42iOgtcbCgM7xDqG1Zrh2gcagA218SgAcaofgDQx4IeSxc7ZyJliBMSG2LChhyzpqL8U6ifDCd-xehNaP9FTDEJwHfBuVFNKrA0gtveRKvmPqWgMOW0zmZ1nTGva9FP01957vEDg0R7puQ594_m82EJm-wK8eMn35SfVSmUA6ECY2Oaml7sD33MMeYW-CahL-G8pIlZ-zr_LYBLfBg9GJyh3aA7jYHpXUGF1wi8BFbLm3xMcgd8fAVUYX0o0QwYJsj2dL2mw9d4_LACa9-SmuxdCkyh-UpMrBBO9iY4k-26CFl0ZHFNyB681eg9S_PDW_fHnvP_-h__c2aRasmbM5n-CiqGaMsmlB60m_YNuW47ZsW1qURVPO5nVDi3w7nVcFsnLeTuSC5pTl07ykRTEr6wwLWk_LFlnJhKjmM1LmOHCpMqV2Q4w9kc4FXFR0Op1PFN-icukKQKnGPaRFQmm8EdhFtHnahs6RMlfSeXf14qVXuDjvzqjFT1oYa-PJTCj9rb1CKD3VSuoLiU_KCK6OdZoEqxZ3LErfh20mzEDoJmZz-ngarYnXAkI3CYMjdJMw_hMAAP__lKHCaw">