<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/111558>111558</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[ADT][DenseMap] Assignment of DenseMap values using other DenseMap values may result in assignment of destructed values
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
JanekvO
</td>
</tr>
</table>
<pre>
Has occurred in https://github.com/llvm/llvm-project/issues/110930
Reproducible, linked with libclang-cpp:
```C++
#include <cstdint>
#include "llvm/ADT/DenseMap.h"
#include <iostream>
struct MyInt {
int64_t MemberInt;
MyInt() : MemberInt(0) {}
MyInt(int64_t Value) : MemberInt(Value) {}
MyInt(MyInt &MI) : MemberInt(MI.MemberInt) {}
MyInt(MyInt &&Other) : MemberInt(Other.MemberInt){
Other.MemberInt = -1;
}
MyInt &operator=(MyInt &Other) {
MemberInt = Other.MemberInt;
return *this;
}
MyInt &operator=(MyInt &&Other) {
MemberInt = Other.MemberInt;
Other.MemberInt = -1;
return *this;
}
};
int main() {
const int until = 100;
llvm::DenseMap<int64_t, MyInt> IntMap;
for (int64_t i = 0; i < until; ++i)
IntMap[i] = MyInt(i);
for (int64_t i = 0; i < until; ++i) {
IntMap[until+i] = IntMap[i];
std::cout << "IntMap[" << until+i << "] = " << IntMap[until+i].MemberInt << std::endl;
}
return 0;
}
```
Will print:
```
IntMap[100] = 0
IntMap[101] = 1
...
IntMap[189] = 89
IntMap[190] = 90
IntMap[191] = -1
IntMap[192] = 92
IntMap[193] = 93
...
IntMap[198] = 98
IntMap[199] = 99
```
Where `IntMap[191]` has been assigned using an already `move`d `MyInt` which I believe happens in `DenseMap.h`'s `void moveFromOldBuckets(BucketT *OldBucketsBegin, BucketT *OldBucketsEnd)` as part of `grow`.
Apologies if this is a known issue (or a wont-fix), if there is one I wasn't able to find it.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVl2PqzYQ_TXOy2iRMYHAAw9J2KipFK1UXbWPlcFOcNexkW2S7r-vDOEjH72tdK8UEfA5PnMYZmxTa8VJcZ6jeIPiYkFbV2uT_0oV_7x8LErNvvJfqAVdVa0xnIFQUDvXWBStEdkhsjsJV7dlUOkzIjspL8PfW2P0X7xyiOyEtS23iOzCEGcRRrhAeN1ff-ON0aytRCk5IluQQn1yBlfhapCirCRVp7eqaXy4flqC-98WkY3_9aMkEqqSLeOAom1lHRPKoej9GSXk5nFdfENkV3Bl-YE2QY0IeaUltHWG0_Mk1l2tM23l4PC1Vw7Q6mYDhHLJ8k8HB34uudl7DwPUcxFJEckAResZh6S4G1xt0Kp4pA-Sv1PZ8ldzJ-Dl_JtFkhz2r2Yf9sHs8UHkSQOR5MPV3LxS6oA7sSkvAPAAA4oKeAtn-RnD3r2Bj6obbqjTBkXF3MzkZB7nPsKjqWjGNNy1RgEia1cL-yNOfoKZ_0zP__K7Ksbh-VUoB2cq1FB9k8VKK-t82UKrnJBd2BDjmXjXLtEaReuhV3xX9EXpO7avkegd9sp14OY-d0dtYFbGogvhA3S32z6uf-z7Wfi6GV_5phlvBIqLbubYFp73E2Ldf68xXs8kU9w7J1N6rGN9cird-o-29WEQISMdETIMj5oz3iA_o730cFcZHW2MzBWT3yveW9lM33RiDGvpfMIfQkpoTLd-Pq65_eNo0BfKzf8zFA5Q2ENBEDxy0mzgpNkjlo3S2ZN2Nmq_hU_YmNKMPGHRiEX_aipLR1L6hI2Gs-x7Kay54YAS_GAZJRhqaqHkXMFt52XQWqFOQBVQaThlX37iWV84SjDz933FJxiutahq2EPJpeAXDjVtGq6s35JRgmc7WYIRWVk_eNGCgRfbGX3-kGzTVp_cWUTS_u6bX02m8Q0_-UViCy_Rd8V80yUYqIWGGgf66IOcjL6iBAfzFKwbLfVJcAviCH65AmGBwqfSVwXdecA3qjZA4aqVezuKv7022fZ8nz9hQSsOe7hSqxBZOaCl5OA0HIViIFywYHnEsiijC56HK5IucZKtyKLOjyU5kpgdl_SYLZcszLKkXIY4jTDL4jLMFiInmCxDjNNwhUkcBlWaLtOYxSQKWZhFFVpifqZCBn75C7Q5LTrTeRiGcZwuJC25tHnf34pf-1fq-3lh8u78U7Yni5ZYCuvsJOOEk91py58_4gLFm3FZjQtYd0Vx5qrL7YDAxW_x9lYp2qfnCTvTLzDcttKv5rfiGnQY748rnN3Yi9bI_EeOcV0SLjn5JwAA__8qOOYr">