annotate gcc/testsuite/g++.dg/opt/pr92262.C @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 // PR tree-optimization/92262
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 // { dg-do compile { target c++11 } }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 // { dg-options "-O2 -ftree-loop-distribution -g" }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 struct A;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 struct B { template <typename T> using b = T *; };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 template <typename, typename T> using c = B::b<T>;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 void *operator new (__SIZE_TYPE__, void *p) { return p; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9 struct C {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 template <typename T, typename... U> void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11 foo (T *x, U... y) { new (x) T(y...); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13 template <typename> class D : public C {};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 template <typename> struct E;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 template <typename T> struct E<D<T>> {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 using e = D<T>;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 template <typename U> using f = D<U>;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18 template <typename U, typename... V>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 static void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 bar (e x, U y, V... z) { x.foo (y, z...); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22 template <typename T> struct F : E<T> {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 template <typename U> struct G { typedef typename E<T>::template f<U> O; };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 template <typename T, typename U, typename V> void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 baz (T x, U y, V z)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 F<V>::bar (z, y, *x);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 struct H {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 typedef c<int, A> I;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 typedef c<int, I> J;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 I i;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 J j;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35 void qux (J x) { j = x; }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 template <typename>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 struct K {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 K(D<A> x) : k (x) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 typedef H::J L;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 struct M { L m; H n, o; };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 struct N : F<D<int>>::G<A>::O, M { N (F<D>::G<A>::O); };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 void quux ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 N k;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 void
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 K<T>::quux ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 L K (k.m - 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 k.n.qux (K);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 template <typename, typename = int>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 struct P : K<int> {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 P (T x, T, D<A> y = D<A> ()) : K (y) { corge (x); }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 template <typename T> void corge (T);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 typedef L L;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 template <typename T, typename U>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 template <typename V>
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 void P<T, U>::corge (V y)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 quux ();
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 for (L x = k.n.j; x < k.o.j; ++x)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 ++y;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 D<int> pv;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 baz (y, *x, pv);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 D<int> z;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 baz (y, k.o.i, z);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 struct A {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 A (int x) : a (x) {}
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 int a;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 };
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 int a[2]{};
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 int
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 main ()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 P<int> (a, a);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 return 0;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 }