<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/108548>108548</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
CUDA: Host-side virtual destructor of template class leaks into PTX as weak function
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
mkuron
</td>
</tr>
</table>
<pre>
Consider the following bit of code:
```c++
void _Adjust_manually_vector_aligned()
{}
template <size_t>
constexpr void _Deallocate() {
_Adjust_manually_vector_aligned();
}
struct basic_string {
constexpr ~basic_string() {
_Deallocate<8>();
}
};
template <class Var_t>
class E {
virtual ~E() = default;
basic_string _name;
};
template class E<float>;
```
Including this into a CUDA file (you don't even have to use the class in a device-side function or variable) leads to errors like `ptxas fatal : Unresolved extern function '_Z31_Adjust_manually_vector_alignedv'` or, when compiling with `-fgpu-rdc`, corresponding errors from `nvlink`. The resulting PTX contains unreferenced `.weak .func`s of the defaulted virtual destructor. This bears some similarity to #98151, but the circumstances under which the extraneous symbol is emitted differ.
The code for `basic_string` and the functions it calls was reduced from https://github.com/microsoft/STL/blob/vs-2022-17.0/stl/inc/xstring and https://github.com/microsoft/STL/blob/vs-2022-17.0/stl/inc/xmemory. This makes it impossible to use `std::string` in template classes with defaulted virtual destructors when using CUDA on Windows in C++20 mode.
Godbolt: https://godbolt.org/z/7MTda4Kq4
NVCC does not show this issue, it never generates `.weak .func` symbols for host-side destructors. Clang appears to only be generating these extraneous `.weak .func` symbols for code that exactly follows the above pattern; eliminating the templates, the `virtual`, the `default`, or the `constexpr`s makes the problem go away.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVk9v47YT_TT0ZRBDphzLOfiQOOvfr-gfFGh2W_RiUOTI4obiuBxKjvewn72gJP9r0G0PDYwkpsiZN_PePEox251HXIn7J3H_PFFtrCmsmtc2kJ-UZI6rNXm2BgPEGqEi5-hg_Q5KG4Eq0GRQ5I8iexbZo1hkw0cL-ZQ-_WpH1sD20XxuOW4b5Vvl3HHboY4Utsql_EbIpZAPY5TiSRTP4__974jN3qmIIPI12y-4jSL_MDzS5Dni2z7AkOYZlXOkVcQhJKRo_c5_CSF_OqG4gcAxtDpCqdjqLceQWnAJfUHx9XrHOwjjzzXKfL1Mxdwmh0v24vkC6V0ztFPM8EmF6470ax-us3Y2xFY5-PrhhCh_BoOVal285LwtbutVgzfd-BsYYz6RrytHqsdx3nnSw_D1O69da1LwWFsG6yOBgvXH50eorEMQcnmkFgx5IYsI2KGHWnUIkaBl7AU4ZLMeFBjsrMa7JE6oWq-jJQ8UoFPBqtJhKtShMpzOYwgUGJx9RRCLbB_fFEOlonIg8kf46AMyuQ4N4FvE4C8RhSy2v-ezf1BPJ2QhFhlQEHINhxo9aGr21qVyDzbWKetdtdu3d8Ho1BK5Bk0hIO_J900ZIVaBmrTZd876V7HIpvBSIwTk1sW07-eX35LgorKeofUBKwzoNZp0anpA9QrThF4sMk4jmto2ko3mrAWDg6QppPiWoUQVGJgaBLaNdSrYeEytEzJ_WM7uZwlx2caBBht023BUXmMCkfzhUFtd90_xLQblkVoGPjYlObAM2NiYABhbVRim11pK9SUjgYpCKuJmhhYZKG8G9xk5YbARtHKO4aAYApo2ld93ro5xz8mR5EbIzc7Gui2nmhohN43VgZiqKOTml5cfhNyUjkohNx3fyUzKu1kxzYTccHRCbqzXQm7exnFIEP7r0A02FI5j-xv1in1dttkTsy3dWfeJyGhS4vzx0hTr4XYGkQehfYtrHqTZcqqpnzzy8Kv1hg79VK0H45YZNGTwhqT_kSkp-cXjXxsxPJhS2Am5-SLkpvjxxaj593_Mr8__9Gm9BkPI4CkC13QYbYC5xaQtG8FjhwF26DGoiPxe0KOeuFdKTRyH8b8qcAprpxJh-30v6EhA3h2hxFPcwYCQb3T67Uy9OGOtIuCb0tEdx4uQe1mqkjqEvYrJOET-BOhsY_0505knTmWmBbHIRm5GJxgXT548LFI4rZ_vl36mB6mkR_tApcMGdgTqoI7TiVnl5iF_UBNczQq5kHm2yOeTepUX2X2lURtcoirN_EGVc1XOi0LnswUu9cSuZCbn2cMsn8k8y-fTYl7gMs8Ls3jQanlfiXmGjbJu6lzXJK4nPXGrWba8ny8nTpXouH-NkNLj4USrTG8VYZUO3ZXtjsU8c5YjX8JEGx2ukhaTtP5_5vS9eHszu712HKrX8SZJtqgYehJPRjFpg1t9Y2wTiPHP3T7QZ9RpgHvoLORmrK1byT8DAAD__5h-_fw">