comparison gcc/testsuite/g++.dg/torture/pr64312.C @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
comparison
equal deleted inserted replaced
68:561a7518be6b 111:04ced10e8804
1 // { dg-do compile }
2
3 template <typename C> struct A
4 {
5 typedef typename C::iterator type;
6 };
7 template <typename T2> struct B
8 {
9 typedef T2 type;
10 };
11 template <typename F2> struct L
12 {
13 typedef typename B<F2>::type::type type;
14 };
15 template <typename C> struct M
16 {
17 typedef typename L<A<C> >::type type;
18 };
19 class C
20 {
21 public:
22 typedef int iterator;
23 };
24 template <class IteratorT> class D
25 {
26 public:
27 typedef IteratorT iterator;
28 template <class Iterator> D (Iterator p1, Iterator) : m_Begin (p1), m_End (0)
29 {
30 }
31 IteratorT m_Begin;
32 IteratorT m_End;
33 };
34 template <class IteratorT> class I : public D<IteratorT>
35 {
36 protected:
37 template <class Iterator>
38 I (Iterator p1, Iterator p2)
39 : D<IteratorT> (p1, p2)
40 {
41 }
42 };
43 class F
44 {
45 public:
46 int nelems;
47 int elems[]; // { dg-error "not at end" }
48 int *
49 m_fn1 ()
50 {
51 return elems;
52 }
53 };
54 class G
55 {
56 public:
57 void *
58 m_fn2 (int)
59 {
60 return m_buffer.m_fn1 ();
61 }
62 F m_buffer;
63 };
64 struct any_incrementable_iterator_interface
65 {
66 virtual ~any_incrementable_iterator_interface () {}
67 };
68 class J : public any_incrementable_iterator_interface
69 {
70 public:
71 J (int) : m_it () {}
72 int m_it;
73 };
74 void *operator new(__SIZE_TYPE__, void *p2) { return p2; }
75 template <class T> typename M<T>::type begin (T) { return 0; }
76 template <class T> typename M<T>::type end (T) {}
77 template <class> class any_iterator
78 {
79 public:
80 template <class WrappedIterator> any_iterator (WrappedIterator)
81 {
82 void *ptr = m_buffer.m_fn2 (0);
83 m_impl = new (ptr) J (0);
84 }
85 ~any_iterator ()
86 {
87 if (m_impl)
88 m_impl->~any_incrementable_iterator_interface ();
89 }
90 G m_buffer;
91 any_incrementable_iterator_interface *m_impl; // { dg-message "next member" }
92 };
93 template <class Reference> class K : public I<any_iterator<Reference> >
94 {
95 public:
96 template <class WrappedRange>
97 K (WrappedRange p1)
98 : I<any_iterator<Reference> > (begin (p1), end (p1))
99 {
100 }
101 };
102 template <class Reference> struct H
103 {
104 typedef K<Reference> type;
105 };
106 template <class, class, class, class, class, class TargetReference>
107 void
108 mix_values_impl ()
109 {
110 C test_data;
111 H<int>::type source_data (test_data);
112 typename H<TargetReference>::type t2 = source_data;
113 }
114 template <class>
115 void
116 mix_values_driver ()
117 {
118 mix_values_impl<int, int, int, int, int, int &> ();
119 }
120 void
121 mix_values ()
122 {
123 mix_values_driver<int> ();
124 }