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