<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/147790>147790</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Clang produces undemangleable symbols with Tk elements sometimes (when mangling concepted functions?)
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          nabijaczleweli
      </td>
    </tr>
</table>

<pre>
    Downstream bug: https://bugs.debian.org/1108037

Building with Debian clang version 21.0.0 (++20250519112653+d0ee35851bb9-1~exp1~20250519112844.1459)

libbfd `bfd_demangle()`, libiberty `cplus_demangle()`, and libstdc++
`abi::__cxx_demangle()`, all fail to demangle this symbol, but `llvm-cxxfilt` succeeds
```
$ c++filt _ZN5Botan11Cipher_Mode6updateITkNS_8concepts21resizable_byte_bufferESt6vectorIhNS_16secure_allocatorIhEEEEEvRT_m
_ZN5Botan11Cipher_Mode6updateITkNS_8concepts21resizable_byte_bufferESt6vectorIhNS_16secure_allocatorIhEEEEEvRT_m
$ llvm-cxxfilt _ZN5Botan11Cipher_Mode6updateITkNS_8concepts21resizable_byte_bufferESt6vectorIhNS_16secure_allocatorIhEEEEEvRT_m
void Botan::Cipher_Mode::update<std::vector<unsigned char, Botan::secure_allocator<unsigned char>>>(std::vector<unsigned char, Botan::secure_allocator<unsigned char>>&, unsigned long)
```
this manifests as, for example, half-demangled perf:
```
  Samples: 278K of event 'cycles:u', Event count (approx.): 183133005676
    Children      Self Command  Shared Object         Symbol
  +   98.44%     0.00%  bench    bench [.] main
  +   89.76%     0.00%  bench    bench [.] _ZN5Botan11Cipher_Mode6updateITkNS_8concepts21resizable_byte_bufferESt6vectorIhNS_16secure_allocatorIhEEEEEvRT_m
 +   89.76%     0.00%  bench    bench                 [.] Botan::Cipher_Mode::process(std::span<unsigned char, 18446744073709551615ul>)
  +   54.86%     0.00%  bench    bench [.] Botan::CBC_Encryption::finish_msg(std::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, unsigned lo
  +   46.47% 0.16%  bench    bench                 [.] Botan::CBC_Encryption::process_msg(unsigned char*, unsigned long)
  + 43.29%     0.00%  bench    bench                 [.] Botan::CBC_Decryption::finish_msg(std::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, unsigned lo
  +   43.28% 0.19%  bench    bench                 [.] Botan::CBC_Decryption::process_msg(unsigned char*, unsigned long)
  + 40.66%     0.07%  bench    bench                 [.] Botan::BlockCipher::encrypt(unsigned char*) const
  +   40.61%     2.70% bench    bench                 [.] Botan::Twofish::encrypt_n(unsigned char const*, unsigned char*, unsigned long) const
  +   40.35%     0.00%  bench [unknown]             [k] 0000000000000000
  +   38.64%     2.30%  bench bench                 [.] Botan::Twofish::decrypt_n(unsigned char const*, unsigned char*, unsigned long) const
  +   21.28%    12.28%  bench    bench [.] Botan::(anonymous namespace)::TF_E(unsigned int, unsigned int, unsigned int&, unsigned int&, unsigned int, unsigned
  +   20.93% 12.36%  bench    bench                 [.] Botan::(anonymous namespace)::TF_D(unsigned int, unsigned int, unsigned int&, unsigned int&, unsigned int, unsigned
  +   14.96%    11.71%  bench    bench [.] std::vector<unsigned int, Botan::secure_allocator<unsigned int> >::operator[](unsigned long) const
  +    9.29%     0.15%  bench    bench [.] Botan::xor_buf(unsigned char*, unsigned char const*, unsigned long)
  +    8.39%     0.00%  bench    bench                 [.] Botan::PKCS7_Padding::add_padding(std::vector<unsigned char, Botan::secure_allocator<unsigned char> >&, unsigned lo
  +    8.39% 0.00%  bench    bench                 [.] std::vector<unsigned char, Botan::secure_allocator<unsigned char> >::resize(unsigned long)
  +    8.39% 0.00%  bench    bench                 [.] std::vector<unsigned char, Botan::secure_allocator<unsigned char> >::_M_default_append(unsigned long)
 +    8.33%     0.00%  bench    bench                 [.] std::vector<unsigned char, Botan::secure_allocator<unsigned char> >::_S_relocate(unsigned char*, unsigned char*, un
  +    8.33%     0.00%  bench    bench [.] unsigned char* std::__relocate_a<unsigned char*, unsigned char*, Botan::secure_allocator<unsigned char> >(unsigned
  +    8.33%     0.90% bench    bench                 [.] unsigned char* std::__relocate_a_1<unsigned char*, unsigned char*, Botan::secure_allocator<unsigned char> >(unsigne
  +    8.19%     3.06% bench    bench                 [.] _ZN5Botan7xor_bufITkNS_6ranges23contiguous_output_rangeIhEESt4spanIhLm18446744073709551615EETkNS1_16contiguous_rang
 +    7.56%     1.01%  bench    bench                 [.] void std::__relocate_object_a<unsigned char, unsigned char, Botan::secure_allocator<unsigned char> >(unsigned char*
  +    7.34% 0.04%  bench    bench                 [.] auto Botan::load_le<Botan::detail::AutoDetect, unsigned char const*&, unsigned int&, unsigned int&, unsigned int&,
  +    7.29%     0.07%  bench    bench [.] _ZN5Botan6detail8load_anyILNS0_10EndiannessE1ENS0_10AutoDetectETpTkNS0_20unsigned_integralishEJjjjjEQaaaagtsZT1_Li0
 +    7.25%     0.05%  bench    bench                 [.] auto Botan::load_le<Botan::detail::AutoDetect, unsigned char const*&, unsigned int&, unsigned int&, unsigned int&,
  +    7.20%     0.06%  bench    bench [.] _ZN5Botan6detail8load_anyILNS0_10EndiannessE1ENS0_10AutoDetectETpTkNS0_20unsigned_integralishEJjjjjjjjjEQaaaagtsZT1
 +    7.18%     0.05%  bench    bench                 [.] auto Botan::store_le<Botan::detail::AutoDetect, unsigned char*&, unsigned int&, unsigned int&, unsigned int&, unsig
  +    7.13%     0.07%  bench    bench [.] _ZN5Botan6detail9store_anyILNS0_10EndiannessE1ENS0_10AutoDetectETkNS0_20unsigned_integralishEjTpTkNS0_20unsigned_in
 +    7.11%     0.39%  bench    bench                 [.] _ZN5Botan6detail8load_anyILNS0_10EndiannessE1ETkNS0_20unsigned_integralishEjTkNS_6ranges16contiguous_rangeIhEESt4sp
 +    7.02%     0.26%  bench    bench                 [.] _ZN5Botan6detail8load_anyILNS0_10EndiannessE1ENS0_10AutoDetectETkNS_6ranges16contiguous_rangeIhEESt4spanIKhLm16EETp
 +    7.01%     0.18%  bench    bench                 [.] _ZN5Botan6detail8load_anyILNS0_10EndiannessE1ENS0_10AutoDetectETkNS_6ranges16contiguous_rangeIhEESt4spanIKhLm32EETp
 +    6.88%     0.21%  bench    bench                 [.] _ZN5Botan6detail9store_anyILNS0_10EndiannessE1EjTkNS_6ranges23contiguous_output_rangeIhEESt4spanIhLm16EETpTkNS0_20u
 +    6.82%     0.42%  bench    bench                 [.] _ZZN5Botan6detail8load_anyILNS0_10EndiannessE1ENS0_10AutoDetectETkNS_6ranges16contiguous_rangeIhEESt4spanIKhLm32EET
 +    6.71%     0.40%  bench    bench                 [.] _ZZN5Botan6detail8load_anyILNS0_10EndiannessE1ENS0_10AutoDetectETkNS_6ranges16contiguous_rangeIhEESt4spanIKhLm16EET
 +    6.66%     0.07%  bench    bench                 [.] auto Botan::store_le<Botan::detail::AutoDetect, unsigned char*&, unsigned int&, unsigned int&, unsigned int&, unsig
  +    6.60%     0.32%  bench    bench [.] _ZZN5Botan6detail9store_anyILNS0_10EndiannessE1EjTkNS_6ranges23contiguous_output_rangeIhEESt4spanIhLm16EETpTkNS0_20
 +    6.60%     0.05%  bench    bench                 [.] _ZN5Botan6detail9store_anyILNS0_10EndiannessE1ENS0_10AutoDetectETkNS0_20unsigned_integralishEjTpTkNS0_20unsigned_in
 +    6.57%     0.41%  bench    bench                 [.] _ZN5Botan6detail9store_anyILNS0_10EndiannessE1ETkNS0_20unsigned_integralishEjTkNS_6ranges23contiguous_output_rangeI
 +    6.47%     0.23%  bench    bench                 [.] _ZN5Botan6detail9store_anyILNS0_10EndiannessE1EjTkNS_6ranges23contiguous_output_rangeIhEESt4spanIhLm32EETpTkNS0_20u
 +    6.28%     0.25%  bench    bench                 [.] _ZZN5Botan6detail8load_anyILNS0_10EndiannessE1ETkNS0_20unsigned_integralishEjTkNS_6ranges16contiguous_rangeIhEESt4s
 +    6.20%     0.30%  bench    bench                 [.] _ZZN5Botan6detail9store_anyILNS0_10EndiannessE1EjTkNS_6ranges23contiguous_output_rangeIhEESt4spanIhLm32EETpTkNS0_20
 +    6.03%     0.30%  bench    bench                 [.] _ZN5Botan13typecast_copyIjTkNS_6ranges16contiguous_rangeERSt4spanIKhLm4EEQaaaasr3stdE26is_default_constructible_vIT
 +    5.78%     0.36%  bench    bench                 [.] _ZN5Botan13typecast_copyIjTkNS_6ranges16contiguous_rangeERSt4spanIKhLm4EEQaaaasr3stdE23is_trivially_copyable_vINSt8
 +    5.64%     0.38%  bench    bench                 [.] _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERSt4spanIhLm4EEjQaaaasr3stdE23is_trivially_copyable_
 +    4.40%     0.00%  bench    [unknown]             [k] 0x7e7e5a48fcfcb490
  +    3.88%     0.91%  bench    bench [.] decltype (_S_construct({parm#1}, {parm#2}, (std::forward<unsigned char>)({parm#3}))) std::allocator_traits<Botan::s
  +    3.69%     0.65% bench    bench                 [.] _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeERSt4spanIhLm4EETkNS1_16contiguous_rangeES2_IKjLm1EEQ
 +    3.68%     0.70%  bench    bench                 [.] _ZN5Botan13typecast_copyITkNS_6ranges23contiguous_output_rangeESt4spanIjLm1EETkNS1_16contiguous_rangeERS2_IKhLm4EEQ
 +    2.98%     0.90%  bench    bench                 [.] std::enable_if<__and_<std::__and_<std::__not_<std::allocator_traits<Botan::secure_allocator<unsigned char> >::__con
  +    2.79%     0.78%  bench    bench                 [.] void std::allocator_traits<Botan::secure_allocator<unsigned char> >::destroy<unsigned char>(Botan::secure_allocator
  Cannot load tips.txt file, please install perf!
```

The actual symbol is found in src:botan3 3.7.1+dfsg-2 src/lib/modes/cbc/cbc.cpp (build/obj/lib/modes_cbc.o):
```cpp
class secure_allocator { /* ... */ };
using secure_vector = std::vector<T, secure_allocator<T>>;

class BOTAN_PUBLIC_API(2, 0) Cipher_Mode : public SymmetricAlgorithm {
  template <concepts::resizable_byte_buffer T>
  void update(T& buffer, size_t offset = 0) {
    // ...
  }
}

class CBC_Mode : public Cipher_Mode {}
class CBC_Encryption : public CBC_Mode {
private:
        void finish_msg(secure_vector<uint8_t>& final_block, size_t offset = 0) override;
}

void CBC_Encryption::finish_msg(secure_vector<uint8_t>& buffer, size_t offset) {
  // ...

  update(buffer, offset);
}
```
equivalent to something like
```cpp
template<concepts::resizable_byte_buffer = std::vector<unsigned char, Botan::secure_allocator<unsigned char>>>  // except as an instantiation, not a default
void Botan::Cipher_Mode::update(std::vector<unsigned char, Botan::secure_allocator<unsigned char>>, unsigned long);
```
it would be nice if clang produced mangled symbols that were understood by everyone else.
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzUW0lz27jW_TX0BhUWCXAQF15IslzlL-l0uuVv0xsWSIISbBDgI0DZyqJ_-yuAGkCZsiXFTvJULkcGMZxz78HFwBssJV1wQq6dcOKEN1e4VUvRXHOc0Qecf2fkiTB6lYlifX0jnrhUDcEVyNqFg8ZgqVQtHTR24K0Db7N2Id2CZBRzVzQLB976vjfyUOx4Y8cbT1rKCsoX4ImqJbgx9UDOMF-AFWkkFRxA3_VcDzhw5MCJAyfQg6EX-onvwyhEDpwUHiEoHIV-liWf_H_Jc-3_a1UaBYHrB2HiwKQbk9EsKwvgRF5WFmlBKswXjJj-EyfyHDgFjGY0I41a61p5zVo5XA_zQteVqsg7cHqEyMMZ1QZA4zTNn5-PNGUMlJgyoATYVgBqSSWQ6yoTTNfJWqUBMLaqPuXPzyVlyok8INs8J6SQ3WCbH2_swABsYOiaIP3nazgRCnPfn9J6SZr0D1GQqK0LrMjd_ePXeTrKBc9JrST0GyLpd5wxkmZrRdKsLUvSzOYqWpFcieZu-XWe-pEkeduQFDMmcmyKZ_qz-vs-rRxv_AuG1KxtA_0K2itBC2DG7NxujdsVdIM7aCpV0ZV03Tto2nIz1wqQL3GjnW71czjsi-potvmBow_pGUa63e4JE3yxmUaW7oxoK8xpSaSSAEvdphQNIM-4qrXsp2CJWflpK_MC1KQpNZB-RwDMTQMdPQCMR5-BKAFZEa6AA-N8nXePWgfGus-ZeZKL1jwf4bpuxLOr8aEx8EfIR8jzwiiOTNcATJeUFQ3hwHzmhJVgKqpKz2EwX-KGFODP7IHkCmw_824m6uYOnAAAkpEbBA4MzVPP9TzzPSM8X-qS7osTTlwnvAEVptxqO0rcODq17S8Q8TkwDz9b2K_NgboROZHSlqqsde2XQvVHQRDFQeDFKPaSMPQjP2yZEWRiWTQM3NHJFrWhTabpjOfNulZUbMpKyqlcppVcfMRcAoOTyaISRG4Qa_ie60eXWnyA1sboG14HLMZHJncHKkAuTN5DCJNpekN-L2sjVy_FxtrJO9L6EWt7bmRrOb4Q1oSJ_LGbe10B6RQxiCcBueBS2Zbx3MjfwoBubJx-Por7J1FSuewhSPkhhs3oB5Z5xVpDcFF4RKNOOGn5IxdPXIM7APyoy7yDj9UxGrlRsLcDsju-zAoF-TArQH8jZwCAD7ff346DetHkgq8r0UrAcUVkjXPSLaAa_m06s8FSrnpwBv-OTira_23T8NwEaeg-dNGlQfBtTjc_k5MfuMl2Wvu-G_uvueaVQLgZ4cQ4qGtvwqCpK2rSmDrmOGfzPyYpkPSCvx-eKKln0ejtx1vR77juD-Oi3pG46D3WoW-fp_M4_YYLfd7sinBRpPWm4FesQztq59L6GKimstlLkgGN_Oa40z_SgpS4ZSrFdU14cYTCngG6VFQfyWKeNsRUJKfMoV3ZgXPepLalctjbnlu6A5LilwyPQrlkhowGAucBi-ScjchppFL_J9Hqs_J3sQy5XnQGq92RMN4E2e4YGDWYL4iEKBdc0UUrWpmKVtWtSs0Tfcqbq0Afte6WX6qho9VspnvyUz-y-tCNrfkSu-Fue-q73uA6dgy5uR4Z8oEwx-0hfb3wwg8qa-dLyxexi4JNEAvOoYNbJWw0TOAiZcRBU6uwIApT1n0ft0rcEEVy9doieNou40hRn1fv3DZ4knghqqgDPDJkMF_fffk691Lfm_GCYs6JlDN_1hXt6czua60cL4XeFlJKuSKLBjMql7P_e3h4eJj9hTHGCyX_uffTL9TriQrau_fBTcb_sBc8i9vgfvYneuHQEz0v-KP38oJUoiGXuuHHHdAV9d3go0snQ9KxOd0Pr3nhYdBLfTf4e6TorHuJ8wT0Bk5rVXmxIuyXkx5yD-6Rw7OObj8q_dPAYn73WS9-0Wx2f4Dcsrk_eHD-LZAjeIA8ckfWpIVnrcdn6vzhon2GMfVOaX3klloCeB7yn270HvLYUktw1pnh5yI31u8hv_xy8bcP8ZEbWSstGhTUUTd8vPb7bvAuXWl_7eIUuWFsSf8jw83pq9Nxf_SQBxZyiH63QNlF9uFACe0Qf6ZafvqOoI_cnpE_Fig_3ug95B66HPn2nS1S65rkWKo0F_X67g0Dzv62Q3cw67bpskFSFTMYUbm72DLHlKbNFc0YSVd3dogP3dhSy3n35x-DHFGZqoauKGZsbfrDHeyvczXqIY-sd-rosk3YIfKTVLHH38F_OAW_hTzYbgIGb9pOeAH1HJOYhDgYlXmZZ0Fiv4ICqLfFS159dVCQnGkDAAeO0vleKA4cOfGkxk3lQOQ78Y1eQfclcFti3X6XonnCTTGUEQKTXn_ItE66n_0Fz-5aJlUNpkr2NwqyTzGyriqi8JLrsHfx_JELMDKbw_Tu88OXyp_N_rI8j9zI8k38PnHiNORb4B2oo8D_Nsg309JCDt1kdHivevbFN-FmKtDSQdM0xbxI7dymoRIuVK_kDZGcdWeu5W6rCrqxpar4rIDSv6t8R5QFkaoR68FpNXqtU01sijkXCug1HChaS1c9K1DSLreqZgRLAiiXCjPW5VZB_zA50BvfLwnAuWox26QYAipBKVqud9dANrmDxpkGggByY9d34KQo5eITNM_gLaOZA28rURDpwNs8y7vfbl7XOoBkLWWFA29F9tCvnOpKYvMK1kKV1_pAmzMsJThkrWMUMBmkY-C6LjDnhlugAw6aON64lZQvtq261zDAQUOvZu61iQY8db9Nnpt01ulwTP68H39Nv_3_5MvdNB1_u3OgPqxOgacjnJXSBBw0BnWbMZqD-bqqiGpoPmYL0VC1rDR64zdFqpphpatPt-la1mu2w5QtYEDphkaGm6xBOLp3YAS6KoYN_U5SBURZSqIMbQNvOyjoDHerDddNi_hGc-x-b5lOJ9MXTHoE40nXYl99n1zUa7TryIxfN3Rlch2Nr73EMOnn-9he0_OBcjVKVfeyVFfFLM2YyB9f4SpWpGloQTbu21Izg72d3vUqgCN2ti3cs68p2blq33rXrIfRmpLkPy1dYUa4AkoAKSqillrVjD6Sl_NkK6UTlTQ8Gd4l2XTHnzxrGABLgHkXfrii2BgdToEOWBhstq5nJMl-VCrrQJIBmhy4hCrwJFpWgIwATnMCaLnJRq8bUbQ5KcA2hbULoRKoJVbgiTQEtLwgjVRCFCBbA7IizVpwAgiTxL0qrlGRoARfkWs_DqE3gnHsXS2vgxzlMI-jAIVhUQZFkhUxxEGSJRkMYVRc0WuTyx57iR-jBHluEEM_hznGHsxg5JVO4JEKU-Yytqpc0SyuqJQtufaDOE68K4YzwqTJ5IfQcHEgdMKbq-bapE1n7UI6gceoVHLfhaKKkeupTV0agh19LbedBUzq_v0jIIxUhCvZSZlWROpl4WlJeGc0re2NdEkBypbnWirSQbcOTK7ahl33_-vAgqplm7m5qPR6wlbbfz7VjXgwl0u3hqlejTZkV9fwvwEAAP__7pC38Q">