| /* { dg-do compile } */ |
| /* { dg-require-effective-target c++17 } */ |
| |
| struct u { |
| int b; |
| int c; |
| template <typename d, typename e> u(d, e); |
| }; |
| template <class, class> struct f { u g; }; |
| template <class h, class i> class v { |
| typedef f<h, i> k; |
| k *l[4]; |
| k m; |
| public: |
| v(h, h); |
| void aa(h, i); |
| }; |
| template <class h, class i> void v<h, i>::aa(h, i) { n(&l[1], &m); } |
| template <class h, class i> void n(f<h, i> **o, f<h, i> *ab) { |
| bool p, r; |
| f q = **o; |
| f<h, i> *t; |
| h a = q.g; |
| h b = t->g; |
| if (r) |
| ; |
| else |
| goto ac; |
| s: |
| p = a.b || a.c < b.c; |
| if (p) |
| goto s; |
| ac: |
| ab->g = b; |
| b = t->g; |
| goto s; |
| } |
| template <class, class, class> class w {}; |
| template <class> class x; |
| template <class, class> class z; |
| class ad { |
| public: |
| template <typename, typename y, typename ae, typename af, typename ag> |
| static void ah(const z<y, ae> &, const z<y, af> &, x<ag> *&); |
| }; |
| template <typename, typename y, typename ae, typename af, typename ag> |
| void ad::ah(const z<y, ae> &ai, const z<y, af> &aj, x<ag> *&) { |
| u c(0, 0), d(0, 0), g(aj, ai); |
| v<u, y> e(c, d); |
| e.aa(g, 0); |
| } |
| template <class, class> class ak; |
| template <class, class, class al, class am, class an> |
| void ao(ak<al, am> ap, ak<al, an> aq) { |
| x<double> *f; |
| ad::ah<int>(*ap.ar, *aq.ar, f); |
| } |
| template <typename, typename, typename al, typename am, typename an, |
| typename as, typename at> |
| void au(w<al, am, as> ap, w<al, an, at> aq) { |
| ao<int, double>(static_cast<as &>(ap), static_cast<at &>(aq)); |
| } |
| template <class, class> class z {}; |
| template <class, class> class ak : public w<int, int, ak<int, int>> { |
| public: |
| z<int, int> *ar; |
| }; |
| template <class, class, class> class av; |
| template <typename, typename, typename, typename al, typename am, typename an, |
| typename aw, typename ax> |
| void ay(av<al, am, aw>, av<al, an, ax>) { |
| aw h, i; |
| au<int, double>(h, i); |
| } |
| template <class, class, class> class av {}; |
| class az { |
| public: |
| typedef av<int, double, ak<int, double>> ba; |
| }; |
| int main() { |
| az::ba j, k; |
| ay<int, double, az>(j, k); |
| } |