| // PR c++/93907 |
| // { dg-options -std=gnu++20 } |
| |
| template <int a> struct c { |
| static constexpr int d = a; |
| typedef c e; |
| }; |
| template <typename> struct f; |
| template <typename b> using g = typename f<b>::e; |
| struct b; |
| template <typename b> struct f { using e = b; }; |
| template <typename ai> struct m { typedef g<ai> aj; }; |
| template <typename b> struct n { typedef typename m<b>::aj e; }; |
| template <typename b> using an = typename n<b>::e; |
| template <typename> constexpr bool ao = c<true>::d; |
| template <typename> constexpr bool i = c<1>::d; |
| template <typename> concept bb = i<b>; |
| #ifdef __SIZEOF_INT128__ |
| using cc = __int128; |
| #else |
| using cc = long long; |
| #endif |
| template <typename> concept cd = bb<cc>; |
| template <typename bt> concept ce = requires { requires cd<bt>; }; |
| template <typename bt> concept h = ce<bt>; |
| template <typename bt> concept l = h<bt>; |
| template <typename> concept cl = ao<b>; |
| template <typename b> concept cp = requires(b j) { |
| requires h<an<decltype(j.begin())>>; |
| }; |
| struct o { |
| template <cl b> requires cp<b> auto operator()(b) {} |
| }; |
| template <typename b> using cm = decltype(o{}(b())); |
| template <typename bt> concept ct = l<bt>; |
| template <typename da> concept dd = ct<cm<da>>; |
| template <typename da> concept de = dd<da>; |
| struct { |
| template <de da, typename b> void operator()(da, b); |
| } di; |
| struct p { |
| void begin(); |
| }; |
| template <typename> using df = p; |
| template <int> void q() { |
| df<int> k; |
| int d; |
| di(k, d); |
| } |