<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/115704>115704</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang] c++ template specialization dispatched incorrectly when template parameters have object reference as a default parameter
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
M0x1m
</td>
</tr>
</table>
<pre>
clang++ compile time template specialization dispatched incorrectly when template has reference to an object as a default parameter
For example:
```c++
#include <type_traits>
template <int...>
struct A;
long _long;
template <int x, int ...xs>
struct A<x, xs...> {
template <int i, typename T = long&, T _l = _long, typename = void>
struct get {
auto operator()() {
using next = typename A<xs...>::template get<i, T, _l>;
return next{}();
}
};
};
template <int x, int ...xs>
template <int i, typename T, T _l>
struct A<x, xs...>::get<i, T, _l, std::enable_if_t<x == i>> {
auto operator()() {
return x;
}
};
template <>
struct A<> {
template <int, typename T, T>
struct get {
auto operator()() {
return -1;
}
};
};
int main()
{
using One = typename A<0, 1>::template get<1>;
if (One{}() != 1) throw -1;
using Zero = typename A<0, 1>::template get<0>;
if (Zero{}() != 0) throw -1;
}
```
Code should not throw any exceptions as it doesn't on gcc, but throws on clang
clang version: 18.1.8
gcc version: 14.2.1
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0VU2PozgQ_TXmUmqEbegkBw7dyea2msuc9hIZUwGvjI1sk6H3168M5HOyPWqtBrXcpFz16tWrEiW8V41BLEnxTopdIobQWlf-mY20Sypbf5RSC9MQ9k7YO0jb9UojBNUhBOx6LQKC71EqodU_IihroFa-F0G2WIMy0jqHMugP-NGiuca0woPDIzo0EiFYEAZs9TfKAMKDgBqPYtABeuFEhwEdyXYke5vPvXWAo-h6jYQvNvKazX9y5rpYGVdG6qFGIHwbPno8BCdU8IT_cYt44UX4VpmQpunFwQc3yABvhL_fRmhrGjjE8-HiAQpGwrYQX9I0Hf0T2O3kMfo5KZDVAgcA8Aimomssw4gO4TsQvoOJA3uNN9_hoCfbTOzWN1pPVtUXAhF-IdFguE8bHzEEC7ZHJ4J1hK0J28znz67xGbwyDRgcw5TqkncqcKktNotfBWowxLIm4vE46MnnDO4wDM5MkDHjareQ4A_Z483FEH9c-nH7_pXe_EL1s9K_7OVc75My2RZ8qOdrNKLSeFDHQ3Qbo3pRQDXFP4zDF3qyqDfeyXWR6nNpnhV2z-VBoSf6_K45W-p6oZ_MwedDEDvaCWWWXIvXDdg8yt8M_jzJWayN_tco07v5BQB1BMLW3wzeDjAQRiMwje-hdfbHYzUzgb_Q2a8yyJ4ziFDPKGRPKVyn5PxNvZVva2sE39pB12BsWMKF-QAcJfZxBfj4DVcBaoveELYKYA00Ukbq1bCE-Gicl8sN-mSAEzqvrCH8Deg6pel6vmykvLvKU5bSpC55veEbkWBJV5xylnHGk7Y8FnXFqlVd4IqxnInX-ljRAmlO16IuNlWiSpaxnMYno-ucpxvMc74-ZlzKotisjyTPsBNKp1qfutS6JlHeD1hSWqyyPNGiQu2nzcnYsiZZXKKujAEv1dB4kmda-eCvEEEFPa3bOaLYwbKx_t9CvSxKD6044XmZXnfs87WaDE6XbQi9j_PE9oTtGxXaoUql7QjbR9rLv5fe2YhJ2H6SwRO2X5Q4lezfAAAA___S4F5f">