annotate gcc/testsuite/g++.dg/ext/attrib55.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 // PR c++/84314
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 // { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 // { dg-additional-options "-w -std=c++11" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 template <typename a, a b> struct c { static constexpr a d = b; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 template <bool b> using e = c<bool, b>;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 template <bool, typename, typename> struct conditional;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 template <typename...> struct f;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 template <typename g, typename h>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 struct f<g, h> : conditional<g::d, g, h>::i {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 template <typename...> struct j;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 template <typename g, typename h> struct j<g, h> : conditional<1, h, g>::i {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 template <typename g, typename h, typename k, typename... l>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 struct j<g, h, k, l...> : conditional<1, j<h, k>, g>::i {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 struct aa : e<!bool()> {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 template <typename, typename> struct m : c<bool, false> {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 template <typename, typename n> struct o {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 template <typename> static c<bool, true> p(int);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 typedef decltype(p<n>(0)) i;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 template <typename, typename> struct ab : o<int, int>::i {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 template <typename> struct s { typedef int ad; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 template <bool, typename = void> struct q;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 template <typename a> struct q<true, a> { typedef a i; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 template <bool, typename ae, typename> struct conditional { typedef ae i; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 template <typename ae, typename r> struct conditional<false, ae, r> {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 typedef r i;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 struct B {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 B(int);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 template <unsigned, typename...> struct af;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 template <unsigned ag, typename t, typename... ah>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 struct af<ag, t, ah...> : af<1, ah...>, B {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 typedef af<1, ah...> ai;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 ai al(af);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 template <typename... am> af(af<ag, am...> p1) : ai(al(p1)), B(0) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 template <unsigned ag, typename t> struct af<ag, t> {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 template <int, typename... ao> struct ap {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 template <typename... am> static constexpr bool ar() {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 return j<ab<am, ao>...>::d;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 template <typename... ao> class as : public af<0, ao...> {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 typedef af<0, ao...> ai;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 template <typename...> using au = ap<m<int, int>::d, ao...>;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 template <typename... am,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 typename q<au<>::template ar<am...>(), bool>::i = true>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 as(as<am...> an) : ai(an) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 template <typename... ao> as<typename s<ao>::ad...> ax(ao...);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 namespace ay {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 class az {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 using ay::az;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 namespace ay {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 template <typename ba> struct C { typedef ba bc; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 template <typename> class bd;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 template <typename bi, typename n> using bj = f<m<bi, n>, ab<bi, n>>;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 template <typename bf, typename... bh> class bd<bf(bh...)> {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 struct F : bj<int, bf> {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 template <typename bl, typename> using bm = typename q<bl::d>::i;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 template <typename bg, typename = bm<aa, void>, typename = bm<F, void>>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 bd(bg);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 using bn = bf;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 bn bo;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 template <typename bf, typename... bh>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 template <typename bg, typename, typename>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76 bd<bf(bh...)>::bd(bg) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 bo;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 typedef long long(__attribute__((fastcall)) bq)(int *);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 struct v : ay::C<as<bq, bq, int>> {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 bc bt() { return ax(nullptr, nullptr, az()); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 class w {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85 int *cc();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 class x : w {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 void ce();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 namespace u {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91 class cf {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93 static cf cg(int, int *, int, az, bd<long long(int *)>);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 void x::ce() {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97 auto bu = 0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 u::cf::cg(bu, cc(), 1, {}, 0);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 }