1 /* { dg-do compile } */
2 /* { dg-require-effective-target c++17 } */
3 
4 struct u {
5   int b;
6   int c;
7   template <typename d, typename e> u(d, e);
8 };
9 template <class, class> struct f { u g; };
10 template <class h, class i> class v {
11   typedef f<h, i> k;
12   k *l[4];
13   k m;
14 public:
15   v(h, h);
16   void aa(h, i);
17 };
aa(h,i)18 template <class h, class i> void v<h, i>::aa(h, i) { n(&l[1], &m); }
n(f<h,i> ** o,f<h,i> * ab)19 template <class h, class i> void n(f<h, i> **o, f<h, i> *ab) {
20   bool p, r;
21   f q = **o;
22   f<h, i> *t;
23   h a = q.g;
24   h b = t->g;
25   if (r)
26     ;
27   else
28     goto ac;
29 s:
30   p = a.b || a.c < b.c;
31   if (p)
32     goto s;
33 ac:
34   ab->g = b;
35   b = t->g;
36   goto s;
37 }
38 template <class, class, class> class w {};
39 template <class> class x;
40 template <class, class> class z;
41 class ad {
42 public:
43   template <typename, typename y, typename ae, typename af, typename ag>
44   static void ah(const z<y, ae> &, const z<y, af> &, x<ag> *&);
45 };
46 template <typename, typename y, typename ae, typename af, typename ag>
ah(const z<y,ae> & ai,const z<y,af> & aj,x<ag> * &)47 void ad::ah(const z<y, ae> &ai, const z<y, af> &aj, x<ag> *&) {
48   u c(0, 0), d(0, 0), g(aj, ai);
49   v<u, y> e(c, d);
50   e.aa(g, 0);
51 }
52 template <class, class> class ak;
53 template <class, class, class al, class am, class an>
ao(ak<al,am> ap,ak<al,an> aq)54 void ao(ak<al, am> ap, ak<al, an> aq) {
55   x<double> *f;
56   ad::ah<int>(*ap.ar, *aq.ar, f);
57 }
58 template <typename, typename, typename al, typename am, typename an,
59           typename as, typename at>
au(w<al,am,as> ap,w<al,an,at> aq)60 void au(w<al, am, as> ap, w<al, an, at> aq) {
61   ao<int, double>(static_cast<as &>(ap), static_cast<at &>(aq));
62 }
63 template <class, class> class z {};
64 template <class, class> class ak : public w<int, int, ak<int, int>> {
65 public:
66   z<int, int> *ar;
67 };
68 template <class, class, class> class av;
69 template <typename, typename, typename, typename al, typename am, typename an,
70           typename aw, typename ax>
ay(av<al,am,aw>,av<al,an,ax>)71 void ay(av<al, am, aw>, av<al, an, ax>) {
72   aw h, i;
73   au<int, double>(h, i);
74 }
75 template <class, class, class> class av {};
76 class az {
77 public:
78   typedef av<int, double, ak<int, double>> ba;
79 };
main()80 int main() {
81   az::ba j, k;
82   ay<int, double, az>(j, k);
83 }
84