annotate gcc/testsuite/g++.dg/torture/pr58555.C @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 84e7813d76e9
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" } */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
3
111
kono
parents:
diff changeset
4 template <typename _Tp> _Tp *__addressof(_Tp &) {}
kono
parents:
diff changeset
5 template <typename _Tp> class A {
kono
parents:
diff changeset
6 public:
kono
parents:
diff changeset
7 typedef _Tp *pointer;
kono
parents:
diff changeset
8 };
kono
parents:
diff changeset
9 template <typename _Tp> class M : public A<_Tp> {
kono
parents:
diff changeset
10 public:
kono
parents:
diff changeset
11 typedef M other;
kono
parents:
diff changeset
12 ~M();
kono
parents:
diff changeset
13 };
kono
parents:
diff changeset
14 class B {
kono
parents:
diff changeset
15 public:
kono
parents:
diff changeset
16 B(int *);
kono
parents:
diff changeset
17 };
kono
parents:
diff changeset
18 class C {
kono
parents:
diff changeset
19 public:
kono
parents:
diff changeset
20 void GetNext();
kono
parents:
diff changeset
21 C *GetChildren();
kono
parents:
diff changeset
22 };
kono
parents:
diff changeset
23 template <typename _Tp> void _Destroy(_Tp *p1) { p1->~_Tp(); }
kono
parents:
diff changeset
24 struct D {
kono
parents:
diff changeset
25 template <typename _ForwardIterator>
kono
parents:
diff changeset
26 static void __destroy(_ForwardIterator p1, _ForwardIterator p2) {
kono
parents:
diff changeset
27 for (; p1 != p2; ++p1)
kono
parents:
diff changeset
28 _Destroy(__addressof(*p1));
kono
parents:
diff changeset
29 }
kono
parents:
diff changeset
30 };
kono
parents:
diff changeset
31 template <typename _ForwardIterator>
kono
parents:
diff changeset
32 void _Destroy(_ForwardIterator p1, _ForwardIterator p2) {
kono
parents:
diff changeset
33 D::__destroy(p1, p2);
kono
parents:
diff changeset
34 }
kono
parents:
diff changeset
35 template <typename _ForwardIterator, typename _Tp>
kono
parents:
diff changeset
36 void _Destroy(_ForwardIterator p1, _ForwardIterator p2, M<_Tp> &) {
kono
parents:
diff changeset
37 _Destroy(p1, p2);
kono
parents:
diff changeset
38 }
kono
parents:
diff changeset
39 template <typename _Alloc> struct F {
kono
parents:
diff changeset
40 typedef _Alloc _Tp_alloc_type;
kono
parents:
diff changeset
41 typedef typename _Tp_alloc_type::pointer pointer;
kono
parents:
diff changeset
42 struct N : _Tp_alloc_type {
kono
parents:
diff changeset
43 pointer _M_start;
kono
parents:
diff changeset
44 pointer _M_finish;
kono
parents:
diff changeset
45 };
kono
parents:
diff changeset
46 _Tp_alloc_type &_M_get_Tp_allocator();
kono
parents:
diff changeset
47 N _M_impl;
kono
parents:
diff changeset
48 };
kono
parents:
diff changeset
49 template <typename _Tp, typename _Alloc = M<_Tp> > class O : F<_Alloc> {
kono
parents:
diff changeset
50 using F<_Alloc>::_M_get_Tp_allocator;
kono
parents:
diff changeset
51 public:
kono
parents:
diff changeset
52 ~O() {
kono
parents:
diff changeset
53 _Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
kono
parents:
diff changeset
54 _M_get_Tp_allocator());
kono
parents:
diff changeset
55 }
kono
parents:
diff changeset
56 };
kono
parents:
diff changeset
57 template <class T> void checked_delete(T *p1) { delete p1; }
kono
parents:
diff changeset
58 template <class> class I;
kono
parents:
diff changeset
59 template <class T> struct J {
kono
parents:
diff changeset
60 typedef T *type;
kono
parents:
diff changeset
61 };
kono
parents:
diff changeset
62 class K;
kono
parents:
diff changeset
63 class L {
kono
parents:
diff changeset
64 public:
kono
parents:
diff changeset
65 virtual ~L();
kono
parents:
diff changeset
66 };
kono
parents:
diff changeset
67 class P : L {
kono
parents:
diff changeset
68 O<I<int> > databasesM;
kono
parents:
diff changeset
69 O<I<K> > usersM;
kono
parents:
diff changeset
70 public:
kono
parents:
diff changeset
71 I<int> addDatabase();
kono
parents:
diff changeset
72 };
kono
parents:
diff changeset
73 C a;
kono
parents:
diff changeset
74 C *b;
kono
parents:
diff changeset
75 int atomic_exchange_and_add();
kono
parents:
diff changeset
76 class G {
kono
parents:
diff changeset
77 public:
kono
parents:
diff changeset
78 virtual void dispose() = 0;
kono
parents:
diff changeset
79 void release() {
kono
parents:
diff changeset
80 if (atomic_exchange_and_add() == 1)
kono
parents:
diff changeset
81 dispose();
kono
parents:
diff changeset
82 }
kono
parents:
diff changeset
83 };
kono
parents:
diff changeset
84 class Q : G {
kono
parents:
diff changeset
85 P *px_;
kono
parents:
diff changeset
86 Q() {}
kono
parents:
diff changeset
87 void dispose() { checked_delete(px_); }
kono
parents:
diff changeset
88 };
kono
parents:
diff changeset
89 class H {
kono
parents:
diff changeset
90 G *pi_;
kono
parents:
diff changeset
91 public:
kono
parents:
diff changeset
92 H();
kono
parents:
diff changeset
93 H(P *);
kono
parents:
diff changeset
94 ~H() {
kono
parents:
diff changeset
95 if (pi_)
kono
parents:
diff changeset
96 pi_->release();
kono
parents:
diff changeset
97 }
kono
parents:
diff changeset
98 };
kono
parents:
diff changeset
99 template <class T, class Y> void sp_pointer_construct(I<T> *, Y, H);
kono
parents:
diff changeset
100 template <class T> class I {
kono
parents:
diff changeset
101 public:
kono
parents:
diff changeset
102 typedef T element_type;
kono
parents:
diff changeset
103 template <class Y> I(Y *p1) { sp_pointer_construct(this, 0, 0); }
kono
parents:
diff changeset
104 typename J<T>::type operator->();
kono
parents:
diff changeset
105 H pn;
kono
parents:
diff changeset
106 };
kono
parents:
diff changeset
107 void getNodeContent(const B &) {
kono
parents:
diff changeset
108 for (C *n = a.GetChildren(); n; n->GetNext())
kono
parents:
diff changeset
109 ;
kono
parents:
diff changeset
110 }
kono
parents:
diff changeset
111 void parseDatabase(I<P> p1) {
kono
parents:
diff changeset
112 I<int> c = p1->addDatabase();
kono
parents:
diff changeset
113 for (; b;)
kono
parents:
diff changeset
114 getNodeContent(0);
kono
parents:
diff changeset
115 }
kono
parents:
diff changeset
116 void addServer() { I<int>(new P); }