<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">