annotate gcc/testsuite/g++.dg/torture/pr34641.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 }
kono
parents:
diff changeset
2 // { dg-require-effective-target fpic }
kono
parents:
diff changeset
3 // { dg-require-visibility "" }
kono
parents:
diff changeset
4 // { dg-options "-fPIC" }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
5 /* { dg-additional-options "-Wno-return-type" } */
111
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7
kono
parents:
diff changeset
8 typedef __SIZE_TYPE__ size_t;
kono
parents:
diff changeset
9 extern "C" void *
kono
parents:
diff changeset
10 malloc (size_t __size)
kono
parents:
diff changeset
11 throw () __attribute__ ((__malloc__));
kono
parents:
diff changeset
12 namespace std __attribute__ ((__visibility__ ("default")))
kono
parents:
diff changeset
13 {
kono
parents:
diff changeset
14 using::size_t;
kono
parents:
diff changeset
15 }
kono
parents:
diff changeset
16 inline void *operator
kono
parents:
diff changeset
17 new (std::size_t, void *__p)
kono
parents:
diff changeset
18 throw ()
kono
parents:
diff changeset
19 {
kono
parents:
diff changeset
20 return __p;
kono
parents:
diff changeset
21 }
kono
parents:
diff changeset
22 template < class _T1, class _T2 > struct pair
kono
parents:
diff changeset
23 {
kono
parents:
diff changeset
24 _T1 first;
kono
parents:
diff changeset
25 _T2 second;
kono
parents:
diff changeset
26 pair (const _T1 & __a, const _T2 & __b):first (__a), second (__b)
kono
parents:
diff changeset
27 {
kono
parents:
diff changeset
28 }
kono
parents:
diff changeset
29 template < class _U1, class _U2 >
kono
parents:
diff changeset
30 pair (const pair < _U1, _U2 > &__p):first (__p.first), second (__p.second)
kono
parents:
diff changeset
31 {
kono
parents:
diff changeset
32 }
kono
parents:
diff changeset
33 };
kono
parents:
diff changeset
34
kono
parents:
diff changeset
35 template < class _T1, class _T2 >
kono
parents:
diff changeset
36 inline pair < _T1, _T2 > make_pair (_T1 __x, _T2 __y)
kono
parents:
diff changeset
37 {
kono
parents:
diff changeset
38 return pair < _T1, _T2 > (__x, __y);
kono
parents:
diff changeset
39 }
kono
parents:
diff changeset
40 template < typename _Tp > inline const _Tp &
kono
parents:
diff changeset
41 max (const _Tp & __a, const _Tp & __b)
kono
parents:
diff changeset
42 {
kono
parents:
diff changeset
43 }
kono
parents:
diff changeset
44 typedef unsigned short int uint16_t;
kono
parents:
diff changeset
45 typedef unsigned long int uintptr_t;
kono
parents:
diff changeset
46 typedef uint16_t UChar;
kono
parents:
diff changeset
47 namespace std __attribute__ ((__visibility__ ("default")))
kono
parents:
diff changeset
48 {
kono
parents:
diff changeset
49 struct __numeric_limits_base
kono
parents:
diff changeset
50 {
kono
parents:
diff changeset
51 };
kono
parents:
diff changeset
52 template < typename _Tp > struct numeric_limits:public __numeric_limits_base
kono
parents:
diff changeset
53 {
kono
parents:
diff changeset
54 static _Tp max () throw ()
kono
parents:
diff changeset
55 {
kono
parents:
diff changeset
56 }
kono
parents:
diff changeset
57 };
kono
parents:
diff changeset
58 }
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 template < typename T > class VectorBufferBase
kono
parents:
diff changeset
61 {
kono
parents:
diff changeset
62 public:
kono
parents:
diff changeset
63 void allocateBuffer (size_t newCapacity)
kono
parents:
diff changeset
64 {
kono
parents:
diff changeset
65 if (newCapacity > std::numeric_limits < size_t >::max () / sizeof (T))
kono
parents:
diff changeset
66 *(int *) (uintptr_t) 0xbbadbeef = 0;
kono
parents:
diff changeset
67 }
kono
parents:
diff changeset
68 };
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 template < typename T, size_t inlineCapacity > class VectorBuffer;
kono
parents:
diff changeset
71 template < typename T > class VectorBuffer < T, 0 >:private VectorBufferBase <
kono
parents:
diff changeset
72 T >
kono
parents:
diff changeset
73 {
kono
parents:
diff changeset
74 public:
kono
parents:
diff changeset
75 typedef VectorBufferBase < T > Base;
kono
parents:
diff changeset
76 using Base::allocateBuffer;
kono
parents:
diff changeset
77 };
kono
parents:
diff changeset
78
kono
parents:
diff changeset
79 template < typename T, size_t inlineCapacity = 0 > class Vector
kono
parents:
diff changeset
80 {
kono
parents:
diff changeset
81 typedef VectorBuffer < T, inlineCapacity > Impl;
kono
parents:
diff changeset
82 public:
kono
parents:
diff changeset
83 typedef T *iterator;
kono
parents:
diff changeset
84 size_t size () const
kono
parents:
diff changeset
85 {
kono
parents:
diff changeset
86 return m_size;
kono
parents:
diff changeset
87 }
kono
parents:
diff changeset
88 size_t capacity () const
kono
parents:
diff changeset
89 {
kono
parents:
diff changeset
90 }
kono
parents:
diff changeset
91 iterator begin ()
kono
parents:
diff changeset
92 {
kono
parents:
diff changeset
93 }
kono
parents:
diff changeset
94 iterator end ()
kono
parents:
diff changeset
95 {
kono
parents:
diff changeset
96 return begin () + m_size;
kono
parents:
diff changeset
97 }
kono
parents:
diff changeset
98 void shrink (size_t size);
kono
parents:
diff changeset
99 void reserveCapacity (size_t newCapacity);
kono
parents:
diff changeset
100 void clear ()
kono
parents:
diff changeset
101 {
kono
parents:
diff changeset
102 shrink (0);
kono
parents:
diff changeset
103 }
kono
parents:
diff changeset
104 template < typename U > void append (const U &);
kono
parents:
diff changeset
105 void expandCapacity (size_t newMinCapacity);
kono
parents:
diff changeset
106 template < typename U > U * expandCapacity (size_t newMinCapacity, U *);
kono
parents:
diff changeset
107 size_t m_size;
kono
parents:
diff changeset
108 Impl m_impl;
kono
parents:
diff changeset
109 };
kono
parents:
diff changeset
110 template < typename T, size_t inlineCapacity >
kono
parents:
diff changeset
111 void Vector < T, inlineCapacity >::expandCapacity (size_t newMinCapacity)
kono
parents:
diff changeset
112 {
kono
parents:
diff changeset
113 reserveCapacity (max
kono
parents:
diff changeset
114 (newMinCapacity,
kono
parents:
diff changeset
115 max (static_cast < size_t > (16),
kono
parents:
diff changeset
116 capacity () + capacity () / 4 + 1)));
kono
parents:
diff changeset
117 }
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 template < typename T, size_t inlineCapacity >
kono
parents:
diff changeset
120 template < typename U >
kono
parents:
diff changeset
121 inline U * Vector < T,
kono
parents:
diff changeset
122 inlineCapacity >::expandCapacity (size_t newMinCapacity, U * ptr)
kono
parents:
diff changeset
123 {
kono
parents:
diff changeset
124 expandCapacity (newMinCapacity);
kono
parents:
diff changeset
125 }
kono
parents:
diff changeset
126 template < typename T, size_t inlineCapacity >
kono
parents:
diff changeset
127 void Vector < T, inlineCapacity >::reserveCapacity (size_t newCapacity)
kono
parents:
diff changeset
128 {
kono
parents:
diff changeset
129 m_impl.allocateBuffer (newCapacity);
kono
parents:
diff changeset
130 }
kono
parents:
diff changeset
131 template < typename T, size_t inlineCapacity >
kono
parents:
diff changeset
132 template < typename U >
kono
parents:
diff changeset
133 inline void Vector < T, inlineCapacity >::append (const U & val)
kono
parents:
diff changeset
134 {
kono
parents:
diff changeset
135 const U *ptr = &val;
kono
parents:
diff changeset
136 if (size () == capacity ())
kono
parents:
diff changeset
137 ptr = expandCapacity (size () + 1, ptr);
kono
parents:
diff changeset
138 new (end ())T (*ptr);
kono
parents:
diff changeset
139 }
kono
parents:
diff changeset
140
kono
parents:
diff changeset
141 class Range;
kono
parents:
diff changeset
142 class TextIterator
kono
parents:
diff changeset
143 {
kono
parents:
diff changeset
144 public:
kono
parents:
diff changeset
145 explicit TextIterator (const Range *,
kono
parents:
diff changeset
146 bool emitCharactersBetweenAllVisiblePositions =
kono
parents:
diff changeset
147 false);
kono
parents:
diff changeset
148 bool atEnd () const
kono
parents:
diff changeset
149 {
kono
parents:
diff changeset
150 }
kono
parents:
diff changeset
151 void advance ();
kono
parents:
diff changeset
152 int length () const
kono
parents:
diff changeset
153 {
kono
parents:
diff changeset
154 }
kono
parents:
diff changeset
155 };
kono
parents:
diff changeset
156 UChar *
kono
parents:
diff changeset
157 plainTextToMallocAllocatedBuffer (const Range * r, unsigned &bufferLength)
kono
parents:
diff changeset
158 {
kono
parents:
diff changeset
159 static const unsigned cMaxSegmentSize = 1 << 16;
kono
parents:
diff changeset
160 typedef pair < UChar *, unsigned >TextSegment;
kono
parents:
diff changeset
161 Vector < TextSegment > *textSegments = 0;
kono
parents:
diff changeset
162 Vector < UChar > textBuffer;
kono
parents:
diff changeset
163 for (TextIterator it (r); !it.atEnd (); it.advance ())
kono
parents:
diff changeset
164 {
kono
parents:
diff changeset
165 if (textBuffer.size ()
kono
parents:
diff changeset
166 && textBuffer.size () + it.length () > cMaxSegmentSize)
kono
parents:
diff changeset
167 {
kono
parents:
diff changeset
168 UChar *newSegmentBuffer =
kono
parents:
diff changeset
169 static_cast <
kono
parents:
diff changeset
170 UChar * >(malloc (textBuffer.size () * sizeof (UChar)));
kono
parents:
diff changeset
171 if (!textSegments)
kono
parents:
diff changeset
172 textSegments = new Vector < TextSegment >;
kono
parents:
diff changeset
173 textSegments->
kono
parents:
diff changeset
174 append (make_pair (newSegmentBuffer, textBuffer.size ()));
kono
parents:
diff changeset
175 textBuffer.clear ();
kono
parents:
diff changeset
176 }
kono
parents:
diff changeset
177 }
kono
parents:
diff changeset
178 }