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