<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/61145>61145</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang omits call to move constructor with aggregate init from template type
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
danakj
</td>
</tr>
</table>
<pre>
cc: @alanzhao1
This code double frees with Clang, when it should not: https://godbolt.org/z/5sfT8sW4j
```cpp
#include <iostream>
#include <utility>
struct VecIter;
struct Vec {
Vec() : i(new int[3]) {
std::cerr << this << " Vec::Vec()\n";
i[0] = 1;
i[1] = 2;
i[2] = 3;
}
Vec(Vec&& o) : i(o.i) {
std::cerr << this << " Vec::Vec&&\n";
o.i = nullptr;
}
Vec& operator=(Vec&& o) {
std::cerr << this << " Vec::operator=&&\n";
delete[] i;
i = o.i;
o.i = nullptr;
return *this;
}
~Vec() {
std::cerr << this << " Vec::~Vec\n";
delete[] i;
}
int* i;
};
struct S {
static S make(auto&& vec) {
Vec v;
std::cerr << "Building Vec for S " << &v << "\n";
v.i[0] = vec.i[0];
v.i[1] = vec.i[1];
v.i[2] = vec.i[2];
std::cerr << "Construct S from Vec " << &v << "\n";
// Clang bug:
// The Vec::Vec(Vec&&) constructor is omitted here when constructing S
// and S::vec.
//
// * This does not happen if the parameter is `Vec&&` instead of `auto&&`.
// * It also does not happen if we uncomment the explicit constructor for S
// below.
return S(std::move(v));
}
// Defining this constructor fixes the bug in S::make() and causes the Vec
// move constructor to be called.
// S(Vec vec) : vec(std::move(vec)) {}
Vec vec;
};
int main() {
auto s = S::make(Vec());
std::cerr << s.vec.i[0] << "\n";
std::cerr << s.vec.i[1] << "\n";
std::cerr << s.vec.i[2] << "\n";
}
```
Output in GCC:
```
0x7ffe7c534788 Vec::Vec()
0x7ffe7c534758 Vec::Vec()
Building Vec for S 0x7ffe7c534758
Construct S from Vec 0x7ffe7c534758
0x7ffe7c534780 Vec::Vec&&
0x7ffe7c534758 Vec::~Vec
0x7ffe7c534788 Vec::~Vec
1
2
3
0x7ffe7c534780 Vec::~Vec
```
Output in Clang:
```
0x7ffe481779b0 Vec::Vec()
0x7ffe48177958 Vec::Vec()
Building Vec for S 0x7ffe48177958
Construct S from Vec 0x7ffe48177958
0x7ffe48177958 Vec::~Vec
0x7ffe481779b0 Vec::~Vec
0
0
493486096
0x7ffe481779b8 Vec::~Vec
free(): double free detected in tcache 2
```
Can't show the output of MSVC from godbolt but the code works there.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysV02T2jgQ_TXi0hXKlr_gwIGBZSuHrT2Qyp5lu8FKZMklyZDkkN--JZkPA4KpbJaZwpT7qbvfk7olMWP4XiIuSPZGsvWE9bZRelEzyb5-mZSq_r6oKpIsgaQRE0z-aJiKgURrEi2H708NN1CpGqFWfSkQdhrRwJHbBlaCyT2hKzg2KIFbMI3qRQ1SWeezsbYzJFkSuiF0s1d1qYSdKr0ndPOD0E1mdp9m5p_0yzgeyaPhv-q60xuacFmJvkYgyYorYzWyliR_hMy95YLb71er_zZW95WFz1h9tKhJ8hY2AilOFgBwLwidEToHR4YTOpN4BC4tyd4Skq29ZTzAfYytHeNkWaHWLiGSrMA6DU-_CaXeswddQpBsJQmll8zO7jjJ3iKSrYEka4iD5vhsDo-mZ3NyYybF-p6p_84JzUGNSasp_7-YOufPmKop92nKXojO6neSzUF1qJlVmiTrQO6_l-yN71dJ1yjQ4lBbwB_194ycgBfLK5ruo9H2WgKhS5fdcxV-jlbnheyvsfQufpHYJYcr3BUEXY5ADhOssO3tvBjLLK9gCy37ioTOWG_VaRIPjlxgGl2NHh6SDdImlL71XNRc7v2wndIuAUqvgPwwAj9T4jC9qcEDVpcXT7DxPTa-wQ4geg-iIYfPmK2UvGi606odmtcvcxsa89DGoez3LlYI8KnB-551rWc6h-qcjtLADaiWW4s1NKhx2BouADcb22AMJmvYDhGcJOf15o3BAW7R-c2pVmjclgMN6zq3D-3ANggd06xFiz4lkkfXjPMIuDQWWQ1q50zXlUfyaPo02kcLTBgVCnhE6GWl2hal9dHxWyd4xe2NNn4NBt0DlCjUcRpsBltCZ5eV0KqDK5aD2zToPNwgRq8G92vccem0t8NuPkqJf0PjMy77PXB5noNTTbrZdTNTsd6ccE7He_8uqRu3VkGJUDEhsJ4-wLfDArqUebIcfj6y9IBzK3ikd3byvPVwaaFlXD70SgBw0w7GV-Et6-u2PFY4WIxmOu4I79TcOx7i3_ZAX3u4Kng-ZI2l-ru3XW_dGvhztbq0gjto9K3Y7bCosiQtZrPQSeYBlj2HBTr07cgBFmx3IeBNdlHo9PEyu5-Xtf2M5hURDw86PJLX8a_D3lF-OFG_1D6dxUUxL-_Z3Ws_wP6L9ueR72p_C3wW9l7Ux_xHiJtHOk_SWR7N88DwYAB3NTlRTJbj-wrUaLFyexKXYCtWNQj0xYSsmCS08PeZo296apghtYO_tp9XgxCnCw2U_dDy_SXpqPRX3yc1Tif1IqnnyZxNcBHnRTGL85QWk2YRpxWmFaU0wTraZbSu45Tlu3o-m7FsXs4nfEEjmkTuL42KKJ_GBZZxhWkZ5VFdJnOSRtgyLqZCHFp3pZpwY3pc5HGcZhPBShTG3_ko9ZcWZ_QNYT3RCzfmQ9nvDUkjwY01Vy-WW4GL4UDgtnHje7hr5w8t3t8A2X6vcc8sApfcDrpYbDvhXtnvHU56LRZ3F0Fum76cVqoldOMinx4fOq2-YGUJ3fh8DaEbz-ffAAAA__8zsu6K">