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

    <tr>
        <th>Summary</th>
        <td>
            Compare operator not defined for recursive data types on C++20
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    Cross-posting https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111504

The following code works on C++17 but not C++20:

```C++
#include <cstdint>
#include <type_traits>
#include <vector>

template <typename T1, typename T2>
static auto hasLessThanHelper(int)
    -> decltype(std::declval<T1>() < std::declval<T2>(), std::true_type{});

template <typename, typename>
static auto hasLessThanHelper(long) -> std::false_type;

template <typename T1, typename T2>
struct hasLessThan : decltype(hasLessThanHelper<T1, T2>(0)) {};

struct DynamicType {
  using T1 = int64_t;
  using T2 = std::vector<DynamicType>;
};

template <
    typename DT,
 typename = std::enable_if_t<
        (hasLessThan<typename DT::T1, typename DT::T1>::value ||
         hasLessThan<typename DT::T1, typename DT::T2>::value ||
         hasLessThan<typename DT::T2, typename DT::T1>::value ||
         hasLessThan<typename DT::T2, typename DT::T2>::value)>>
inline constexpr bool operator<(const DT& x, const DT& y) {
  // implementation omitted
  return true;
}

int main() {
  using DT = DynamicType;
  // This assert works on C++17, but fails on C++20
  static_assert(hasLessThan<std::vector<DT>, std::vector<DT>>::value);
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0VU2P4ygQ_TXkgjqyi3z54EO3M9Ee9uh7hKHssIvBAtw9mV-_giRuJ53ZWa12W5ZbqSq_evV4APdedQaxJOs3st4v-BhO1pU_uJdt15h-0Vh5LitnvX8ZrA_KdPQUwuAJeyVwIHDohFh2Zlxa1xE4NGP3Q2nNCRz8yX4cm7Fbik4RdlCSsH2e5-tsRbI9yV4v7_qEtLVa248ILaxE-mHdn55aQysCbwTe8i1txkCNDbcIZLH9DIVssstzLbhGgSkj9CiRElYJH6QygbBvz7LhPOAxOK6C_0nFO4pg3WcyvQP2g-ZhgjC8R1rnBCr6-ROmj3zgQQnKx2Dpifvf0fv6xM1vqAd0BHaRHxSXWkopfSHsG5UodAQjsPNBxsnZa4y9c01YVecRHXYEikiCPiuBqSQSmyqCG_GYkLdvZLuPafb2q-nmo_3jubQ1XSSY5pn6t1z7K4Ff9_1bVd0owrwxJex1rttXTkk4qOhNmyyJU9CrFPd8rg32Z8N7JerzgKnuukyjj9atc0rYnioTNqtjmACmNKT0NPvNTdUMNDKZGn8hMRfl0yGTHvuawC0-Be9aouGNxqNqI70ZRPy712gu-76-fP0g_ywcWaeRuB6jMFV87tDpv8SG_wIb_kfeP8F-4J021rfJrspoZZAKa3zA74OjjbWa2gEdv1iCwC4l05pu6PfYZB4434x6JXs5iKnqB409mrgXraG2VyGgvBU5DKMzNO75O5PNHKZMoD1X5naaPFp8XydD3Tn2kUR9Up5y79GFJwd5nCSe5S1Xep6B7AZzOUmOF4Qvrnyyfeq0f6tnO6u-qv6wEl-Gv10eC1kyWbCCL7DMN8WawQbYanEqhSianMld0fCizWQmNg1Ai5IVW1xvcLdQJWTAsgLyvFhv89VS8BXKAnmDPBOyaMkqw54rvdT6vY935UJ5P2K52WbrzULzBrVPdzCAwQ-akgQgXsmujN-8NGPnySrTygf_iRJU0FhWth-4w8lD6a6U2CqDkrbWUYdidF69I5U88OTYe_kXo9Plw8WuwmlslsL2BA6x4fXfy-DsHygCgUOi6Qkc0hh_BQAA__8a1nPD">