annotate gcc/testsuite/g++.dg/ipa/pr85421.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 // { dg-do compile }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 // { dg-options "-O3 -std=gnu++1y -w" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 namespace {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 template <typename b> b c(b);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 template <typename d, typename, template <typename> class> struct f {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 using g = d;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 template <typename d, template <typename> class aa> using h = f<d, void, aa>;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 template <typename d, template <typename> class aa>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 using i = typename h<d, aa>::g;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 template <typename b> struct j { typedef b k; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 } // namespace
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 namespace l {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 template <typename b> class m {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 typedef b k;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 } // namespace l
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 namespace a {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 template <typename b> using n = l::m<b>;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 template <typename b> class ac : public n<b> {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 struct s {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 template <typename b> using ad = typename b::e;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 template <typename o> struct p : s {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 typedef typename o::k k;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 using ag = i<k *, ad>;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 } // namespace a
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 namespace l {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 template <typename o> struct t : a::p<o> {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 } // namespace l
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 namespace a {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 template <bool> struct al {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 template <typename am> static void an(am ao, am) { c(*ao); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 template <typename am> void aq(am ao, am ap) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 typedef typename j<am>::k ar;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 al<__has_trivial_destructor(ar)>::an(ao, ap);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 namespace {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 typedef char au;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 } // namespace a
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 typedef char av;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 typedef int aw;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 typedef av ay;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 typedef aw az;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 namespace a {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 template <typename, typename o> struct ba {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 typedef typename l::t<o>::ag ag;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 struct {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 ag bb;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 ag bc;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 } bd;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 template <typename b, typename o = ac<b>> class be : ba<b, o> {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 typedef ba<b, o> bf;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 typedef typename bf::ag ag;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 void bh() { bi(this->bd.bb); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 void bi(ag bj) { aq(bj, this->bd.bc); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 } // namespace a
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 namespace bk {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 enum bl {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 enum bn { bo };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 class q {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 static a::au bp(bn);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 static bool bq(a::au *br, bn g) { return bs(br, g); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 static bl bs(a::au *br, bn g) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 if (br) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76 auto bt = bp(g);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 if (bt)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 return bl();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 template <typename, typename> class bu {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 } // namespace bk
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84 namespace bv {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85 namespace bw {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 class bx;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 } // namespace bv
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 namespace bk {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 enum by { bz };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91 struct ca;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92 class cb {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 class cc {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 virtual void cd(by) = 0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 virtual bu<ca, by> e();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 cc *cf;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101 class cg {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103 ~cg() { q::bq(ch, bo); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 a::au *ch;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106 class ci {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107 cg cj;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109 namespace ck {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110 enum cl : ay;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112 class r : ci {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113 class cn {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115 ck::cl co();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117 by cp(ck::cl);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118 class cq : cb, cb::cc {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119 bu<ca, by> ce(bv::bw::bx &, az) noexcept;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120 void cd(by);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
121 void cr(bv::bw::bx &, az, cb::cc *) noexcept;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122 cn cs;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123 a::be<r> ct;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125 } // namespace bk
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
126 using bv::bw::bx;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127 namespace bk {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
128 bu<ca, by> cq::ce(bx &, az) noexcept { ct.bh(); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
129 void cq::cr(bx &, az, cb::cc *) noexcept { cd(bz); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
130 void cq::cd(by) { cf->cd(cp(cs.co())); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
131 } // namespace bk