annotate gcc/testsuite/g++.dg/torture/pr67191.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // { dg-do compile }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
2 // { dg-additional-options "-Wno-return-type" }
111
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 template <typename> class A;
kono
parents:
diff changeset
5 template <typename _Tp> using __allocator_base = _Tp;
kono
parents:
diff changeset
6 template <class T, class = T, class = int, class = __allocator_base<int>>
kono
parents:
diff changeset
7 class B;
kono
parents:
diff changeset
8 template <class T, class H, class P, class A>
kono
parents:
diff changeset
9 bool operator==(B<T, H, P, A> const &, B<T, H, P, A> const &);
kono
parents:
diff changeset
10 template <class T, class H, class P, class A>
kono
parents:
diff changeset
11 bool operator!=(B<T, H, P, A> const &, B<T, H, P, A> const &);
kono
parents:
diff changeset
12 typedef B<int> int_multiset;
kono
parents:
diff changeset
13 int a;
kono
parents:
diff changeset
14 template <typename> struct C {
kono
parents:
diff changeset
15 C(int) {}
kono
parents:
diff changeset
16 };
kono
parents:
diff changeset
17 template <typename> struct D;
kono
parents:
diff changeset
18 template <typename> struct K;
kono
parents:
diff changeset
19 struct L : C<A<D<int>>>, C<A<K<int>>> {
kono
parents:
diff changeset
20 template <typename First, typename Second>
kono
parents:
diff changeset
21 L(First, Second)
kono
parents:
diff changeset
22 : C<A<D<int>>>(0), C<A<K<int>>>(0) {}
kono
parents:
diff changeset
23 };
kono
parents:
diff changeset
24 template <typename Node> struct F {
kono
parents:
diff changeset
25 typedef typename Node::node_pointer node_pointer;
kono
parents:
diff changeset
26 node_pointer node_;
kono
parents:
diff changeset
27 F();
kono
parents:
diff changeset
28 F(typename Node::link_pointer p1) : node_(static_cast<node_pointer>(p1)) {}
kono
parents:
diff changeset
29 void operator++() { node_ = 0; }
kono
parents:
diff changeset
30 int operator!=(F p1) { return node_ != p1.node_; }
kono
parents:
diff changeset
31 };
kono
parents:
diff changeset
32 struct G {
kono
parents:
diff changeset
33 typedef G *link_pointer;
kono
parents:
diff changeset
34 };
kono
parents:
diff changeset
35 struct H {
kono
parents:
diff changeset
36 static int new_bucket_count(int) {
kono
parents:
diff changeset
37 int b;
kono
parents:
diff changeset
38 int *c = 0;
kono
parents:
diff changeset
39 if (a)
kono
parents:
diff changeset
40 b = *c;
kono
parents:
diff changeset
41 return b;
kono
parents:
diff changeset
42 }
kono
parents:
diff changeset
43 };
kono
parents:
diff changeset
44 class functions {
kono
parents:
diff changeset
45 public:
kono
parents:
diff changeset
46 functions(int, int) {}
kono
parents:
diff changeset
47 ~functions();
kono
parents:
diff changeset
48 };
kono
parents:
diff changeset
49 template <typename Types> struct table : functions {
kono
parents:
diff changeset
50 typedef typename Types::policy policy;
kono
parents:
diff changeset
51 typedef Types node_allocator;
kono
parents:
diff changeset
52 typedef F<typename Types::node> iterator;
kono
parents:
diff changeset
53 L allocators_;
kono
parents:
diff changeset
54 int bucket_count_;
kono
parents:
diff changeset
55 int size_;
kono
parents:
diff changeset
56 typename Types::link_pointer get_previous_start() const;
kono
parents:
diff changeset
57 iterator begin() const { return size_ ? get_previous_start() : 0; }
kono
parents:
diff changeset
58 table(int, typename Types::hasher, typename Types::key_equal, node_allocator)
kono
parents:
diff changeset
59 : functions(0, 0), allocators_(0, 0),
kono
parents:
diff changeset
60 bucket_count_(policy::new_bucket_count(0)), size_() {}
kono
parents:
diff changeset
61 };
kono
parents:
diff changeset
62 template <typename> struct K : G { typedef K *node_pointer; };
kono
parents:
diff changeset
63 struct I {
kono
parents:
diff changeset
64 typedef G *link_pointer;
kono
parents:
diff changeset
65 };
kono
parents:
diff changeset
66 struct J {
kono
parents:
diff changeset
67 typedef I::link_pointer link_pointer;
kono
parents:
diff changeset
68 };
kono
parents:
diff changeset
69 template <typename> struct D {
kono
parents:
diff changeset
70 typedef int hasher;
kono
parents:
diff changeset
71 typedef int key_equal;
kono
parents:
diff changeset
72 typedef K<int> node;
kono
parents:
diff changeset
73 typedef J::link_pointer link_pointer;
kono
parents:
diff changeset
74 typedef H policy;
kono
parents:
diff changeset
75 };
kono
parents:
diff changeset
76 struct M : table<D<int>> {
kono
parents:
diff changeset
77 node_allocator grouped_table_impl_a;
kono
parents:
diff changeset
78 M(int, int) : table(0, 0, 0, grouped_table_impl_a) {}
kono
parents:
diff changeset
79 void equals(M const &) const {
kono
parents:
diff changeset
80 for (iterator d = begin(); d.node_;) {
kono
parents:
diff changeset
81 iterator e;
kono
parents:
diff changeset
82 group_equals(e);
kono
parents:
diff changeset
83 }
kono
parents:
diff changeset
84 }
kono
parents:
diff changeset
85 static int group_equals(iterator p1) {
kono
parents:
diff changeset
86 int f;
kono
parents:
diff changeset
87 iterator g;
kono
parents:
diff changeset
88 for (; g != p1; ++g)
kono
parents:
diff changeset
89 if (find())
kono
parents:
diff changeset
90 if (f)
kono
parents:
diff changeset
91 return 0;
kono
parents:
diff changeset
92 }
kono
parents:
diff changeset
93 static int find();
kono
parents:
diff changeset
94 };
kono
parents:
diff changeset
95 template <class, class, class, class> class B {
kono
parents:
diff changeset
96 M table_;
kono
parents:
diff changeset
97
kono
parents:
diff changeset
98 public:
kono
parents:
diff changeset
99 B(unsigned long = 0);
kono
parents:
diff changeset
100 friend bool operator==<>(B const &, B const &);
kono
parents:
diff changeset
101 friend bool operator!=<>(B const &, B const &);
kono
parents:
diff changeset
102 };
kono
parents:
diff changeset
103 template <class T, class H, class P, class A>
kono
parents:
diff changeset
104 B<T, H, P, A>::B(unsigned long)
kono
parents:
diff changeset
105 : table_(0, 0) {}
kono
parents:
diff changeset
106 template <class T, class H, class P, class A>
kono
parents:
diff changeset
107 bool operator==(B<T, H, P, A> const &p1, B<T, H, P, A> const &p2) {
kono
parents:
diff changeset
108 p1.table_.equals(p2.table_);
kono
parents:
diff changeset
109 }
kono
parents:
diff changeset
110 template <class T, class H, class P, class A>
kono
parents:
diff changeset
111 bool operator!=(B<T, H, P, A> const &p1, B<T, H, P, A> const &p2) {
kono
parents:
diff changeset
112 p1.table_.equals(p2.table_);
kono
parents:
diff changeset
113 }
kono
parents:
diff changeset
114 void use_multiset_fwd_declared_function_typerun() {
kono
parents:
diff changeset
115 int_multiset x, y;
kono
parents:
diff changeset
116 x == y;
kono
parents:
diff changeset
117 x != y;
kono
parents:
diff changeset
118 }