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

    <tr>
        <th>Summary</th>
        <td>
            [libcxxabi] Possibly incorrectly mangled name with conditional templates
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            libc++abi
      </td>
    </tr>

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

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

<pre>
    Found by @var-const when investigating why LLDB fails demangle certain symbols.

Tried on llvm.org top-of-tree as of `9abeb0cbd983c7e32a729e333b033673546e5485` on MacOS

```
namespace std {                                                      
namespace ranges {                                               
                                                                 
template <bool>                                                  
struct IfImpl {                                                  
    template <class IfRes>                                       
    using Select = IfRes;                                        
};                                                               
                                                                 
template <bool Cond, class IfRes>                                
using If = typename IfImpl<Cond>::template Select<IfRes>;        
                                                                 
template <class>                                                 
concept AlwaysTrue = true;                                       
                                                                 
template <class T>                                               
using conditional_template = If<AlwaysTrue<T>, int*>;            
                                                                 
template<typename T>                                             
struct True {                                                    
    static const bool value = true;                              
};                                                               
                                                                 
template <class T>                                               
using conditional_template_no_concept = If<True<T>::value, int*>;
                                                                 
}  // namespace ranges                                           
                                                                 
template <class T>                                               
std::ranges::conditional_template<T> k() {                       
    return {};                                                   
}           
} // namespace std

int main() {
    std::k<int>();
}
```

With Clang the DWARF linkage name for this is:
`_ZSt1kISt3FooENSt6ranges6IfImplIL_ZNS1_10AlwaysTrueIT_EEEE6SelectIPiEEv`, which `c++filt` isn't able to demangle.

GCC on the other hand detangles this into `_ZSt1kIiENSt6ranges6IfImplIX10AlwaysTrueIT_EEE6SelectIPiEEv`.

```
$ c++filt -n _ZSt1kIiENSt6ranges6IfImplIX10AlwaysTrueIT_EEE6SelectIPiEEv
std::ranges::IfImpl<AlwaysTrue<int> >::Select<int*> std::k<int>()

$ c++filt -n _ZSt1kISt3FooENSt6ranges6IfImplIXL_ZNS1_10AlwaysTrueIT_EEEEE6SelectIPiEEv
_ZSt1kISt3FooENSt6ranges6IfImplIXL_ZNS1_10AlwaysTrueIT_EEEEE6SelectIPiEEv
```

Any idea what the issue here might be?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzVV12P2joQ_TXhZQRKHJJsHvLA8nGFtO2tykqt-oKcxBDfNTGKzW7593ccQwgs2y6UfSiKQj6Pz5k5Hk9SmW-TidyUOaRbcPruM626mSyVhpeClcDLZ6Y0X1LNyyVe2sLDw-geFpQLBTlb0XIpGGSs0pSXoLarVArVc9yR4w7s_rHiLAdZghDPq56slqDluisXXV0xBlSBXIATujFNWepmaR7f-VnEfEIjEjPf91PX98PID_ohC_p3AT5qwD7R7N9Zexi8vtvq05KumFrTjIHSOTjRPVz1OwWrUC9TV-BZoOtIvILRbLUWVDNw_GEqpXD88bVQSlebTMN0MUXI6-J0kNbmlQmqFOJ-Zer99A5QG2X8NmOCITvHH-2R3s1v54podME7v2V1A5jT3MFQlrlDhnBZwCyYjdJ0UUdIb9fMOHWXTMSvof2x4w9wawa2QcXb-7FaEfowqbW6a3xqobAiZWytYSBe6FY9VhtmJePB-_P7seLg8XJ57SyixJxrLksq5i1w43wc4iAcT8xIxjK81A4ZHGfww4TiuI3DLpZ6VGxs-q4ryQdpSuOalIFdq-qZ9EzFJb74GyrEhzlrXsr5flI1Jmvbq64ZdURPnXZTsRh-PCQT3ODVMnsp2I043TAB2HzYSFpF9vhcPnZhhyeH3Dkk_sX0OEitmN5UpXn0ahO3knDm2qu8GDmtngtdASvs-w6c29Nzp_wJpRn7mJJlHmscZEifa93s_hvXBQwFhg10wWD0bfB1AoKXT3TJakawkBXe4gp4Hdc91PzHTHtP05n2J1KOP890aGMf2mVx-jD_8XnmzT33UFKnj_Mx_kK7Mk6_8PH42dBB478UPCtMf5o55B63BRfatKBcoepIA02x_dWyaYWPWt9_hkPTqxr-EncVFBT77Jzp-lG1Y1_i6wfe_Azl76_JnnI9Gvc0oKQPLfrQLeFPBnvb2E3jcbRa2eRDU1Sa_qMpKr8wS1vVmzLezPX3t5N9TtSN4c76elBugeeMorOorq3BlcJlC-3BYMWXBS5mGLVJhyVeGAZuGEX9qJMnfh77Me1orgVLnOBe8DT7-ZOm3AlG8EUqxVOByGUmqwp54LE1ZG4ny4uZTq3C0_TqqrOpRFJova6TWM_4JT68SXuZXOGJ-Wzb_XXXlfzP5I5MatIKD4I7L446RRJnbBH0YxpmeYZfcQvmEtr3CKOpH5AwIB2BH3hCGeoOIYa9TaVRQAiK6PCEuIR4rht6_X7sRr08TyM_9CKaeZGX-h5-neIs46K3_5LsVElNK90sFd4UXGl1uImFmy9LVkfL4NONLmSVfMIJTZnw_KhTi0hqBf8DBofJSw">