<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/62818>62818</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Missing destructor call after assignment
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
rbberger
</td>
</tr>
</table>
<pre>
Here is a minimal example that reproduces the issue: https://godbolt.org/z/EqdrWznfe
```c++
// DO_SOMETHING from the A destructor should be called when calling test()
void DO_SOMETHING();
struct A {
A() {};
// workaround 1
// issue goes away with
// A() = default;
~A() {
DO_SOMETHING();
}
A & operator=(A a) & {
return *this;
}
};
// workaround 2: issue goes away if B is not a template
template<typename T>
struct B {
void test() {
// workaround 3
//#ifdef __clang__
//this->
//#endif
a = {};
// workaround 4
//a = decltype(a)();
}
private:
A a;
};
// look at disassembly of this function, it should include a call to DO_SOMETHING
void client(B<int> &f) {f.test();}
```
In essence, it assigns `{}` to a member variable, which should trigger the destruction of the old object.
The disassembly should include a call to `DO_SOMETHING`, which it does for GCC, but not Clang. The example shows 4 possible workarounds, including changing `a = {}` to `this->a = {}` which then produces the expected call in disassembly.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx8VU-Tm7gT_TTypWtcWDIMPnDwn3GSQ345_KZqjy6BGtBGSKwkxpkc9rNvSeAxZjepomaw1HS_1--pxZ2TjUYsSHog6WnFB98aW9iyRNugXZVGvBef0SJIBxw6qWXHFeAP3vUKwbfcg8XeGjFU6MC3IdANSNgeWu97R9ie0DOh58aI0ii_NrYh9PyT0PPLX8L-8VPXSJITSfbT3ywZn4rQQ3jG1ZgCTt8u___29eX185f_fYLami4W3INA5-1QeWPBtWZQAkqEiiuFAq4t6vgudQMenSc0J3Q3r_lmpHjIPYWwwzxqLAF7IM_TOsB-jIxLz6ePDwAmwFdjv3NrBi1gs9iKbYLGoAN-5e9wlb5dhHxkZycQWPNB-VmJv-fFx7XfcAAIAGd0IDChGZgeLffGEnYiNN8DjylpNqcJYNEPVgOhe99K959ZZ_wfRJv1gAZbLInLGg7BXdp44OCx6xX3kyc-frGjf-9R8w7hlbCXB0UOc6hRy7vMjyz-jYgtNwllshZYw-VSKa6by2UZERrw9IHh4UvUQtbTOo-yLYzxOyjb5SafhK9U4E5oHqRZyrpQtbfyLfZrpjK_l_-VRsqY78A9COm4c9iV6h1MDYEq1IOuvDSa0CNIfztgUldqEAg8ni3w5tF893NVKYk6qHEg7Ci1J-wl2KuexKnXszPJDnc6tzkwR_tFAzqHusIJzDi-HIS4sdNZErBw6LAr0cIbt5KXKsZfW1m1N_zeyqZBGwfIbXxIo0fWCEYJMOWfWPn1WPo1xM2688s2BCwPrciSe3HpQQTj18bCp-MxbJSDj9Y_BretIdS5TVfXmquDLfTGOVkqnLnFxQbE4mGuVS3XTXghWfJgvLEdJEturl3ujrh8GJIPUxx_9Fh5FCMvqefk1ytRMLFjO77CYpPl25RlWZKv2qJGTEqaYfacVLUoa8bqhPEd29DqOU2rfCULmlCWpJsdpWmS5OtsU-Yo0nRbV3VKMSPbBDsu1Vqpty5cFqs4L4qM5pt8pXiJysXLilKN1-myoTTcXbYI3zyVQ-PINlHSeXfP4qVXWHyVzoU2zS6MyI_XHu3kpg61Xw1WFYv7S_p2KNeV6Qg9h7TTv6femuATQs8RjCP0HMH-EwAA__8shilI">