annotate gcc/testsuite/g++.dg/tree-ssa/pr81702.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 "-O2" }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4 namespace std {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 struct type_info
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 virtual bool __do_catch(const type_info *__thr_type, void **__thr_obj,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 unsigned __outer) const;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 template< typename VALUE_T, typename TYPE >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 struct List_policy
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 typedef VALUE_T *Value_type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 typedef TYPE **Type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 typedef TYPE *Head_type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 typedef TYPE Item_type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 template< typename POLICY >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 class List
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 typedef typename POLICY::Value_type Value_type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 class Iterator
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 typedef typename POLICY::Type Internal_type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 typedef typename POLICY::Value_type value_type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 typedef typename POLICY::Value_type Value_type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 Value_type operator -> () const { return static_cast<Value_type>(*_c); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 Internal_type _c;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 Iterator begin() { return Iterator(); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 Iterator end() { return Iterator(); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 typename POLICY::Head_type _f;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 template<typename ELEM_TYPE> class H_list_item_t { };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 template< typename T, typename POLICY >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 class H_list : public List<POLICY>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 typedef typename POLICY::Item_type Item;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 typedef List<POLICY> Base;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 typedef typename Base::Iterator Iterator;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 Iterator insert(T *e, Iterator const &pred)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 Item **x = &this->_f;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 *x = static_cast<Item*>(e);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 return Iterator();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 template< typename T >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 struct H_list_t : H_list<T, List_policy< T, H_list_item_t<T> > >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 H_list_t(bool b) : H_list<T, List_policy< T, H_list_item_t<T> > >(b) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 template< typename BASE, typename MATCH_RESULT >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 struct Type_matcher : H_list_item_t<BASE>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 explicit Type_matcher(std::type_info const *type);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 typedef MATCH_RESULT Match_result;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 private:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 std::type_info *_type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 typedef H_list_t<BASE> List;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 typedef typename List::Iterator Iterator;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 static List _for_type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76 template< typename BASE, typename MR >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 Type_matcher<BASE, MR>::Type_matcher(std::type_info const *t)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 Iterator c = _for_type.begin();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 t->__do_catch(c->_type, 0, 0);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 _for_type.insert(static_cast<BASE*>(this), _for_type.begin());
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84 template< typename VI, typename HW >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85 class Fa : public Type_matcher<Fa<VI, HW>, VI*>
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 typedef Fa<VI, HW> Self;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 virtual VI *do_match(HW *f) = 0;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 explicit Fa(std::type_info const *type) : Type_matcher<Self, VI*>(type) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93 class Res {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 typedef Fa<Res, Res> R_fac;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 template< typename VI, typename HW_BASE, typename HW, typename BASE >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97 class Fa_t : public BASE
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 Fa_t() : BASE(&typeid(HW)) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101 VI *do_match(HW_BASE *) { return 0; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 template< typename VI, typename HW >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105 class Resource_factory_t : public Fa_t<VI, Res, HW, R_fac > {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107 class Foo {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 class Foo2;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109 class Foo3 : public Res {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110 Resource_factory_t<Foo3, Foo> _x;