Mercurial > hg > CbC > CbC_gcc
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 } |