diff options
-rw-r--r-- | recipes-devtools/clang/clang/0035-libcxx-Implement-LWG3545-std-pointer_traits-should-be-.patch | 660 | ||||
-rw-r--r-- | recipes-devtools/clang/common.inc | 1 |
2 files changed, 661 insertions, 0 deletions
diff --git a/recipes-devtools/clang/clang/0035-libcxx-Implement-LWG3545-std-pointer_traits-should-be-.patch b/recipes-devtools/clang/clang/0035-libcxx-Implement-LWG3545-std-pointer_traits-should-be-.patch new file mode 100644 index 0000000..af86540 --- /dev/null +++ b/recipes-devtools/clang/clang/0035-libcxx-Implement-LWG3545-std-pointer_traits-should-be-.patch | |||
@@ -0,0 +1,660 @@ | |||
1 | From 4d11d353656c5c848ddb2c13112cf1c2f8c041c0 Mon Sep 17 00:00:00 2001 | ||
2 | From: Daniel Cheng <zetafunction+github@gmail.com> | ||
3 | Date: Mon, 18 Sep 2023 05:46:59 -0700 | ||
4 | Subject: [PATCH] [libc++] Implement LWG3545: std::pointer_traits should be | ||
5 | SFINAE-friendly. (#65177) | ||
6 | |||
7 | See https://wg21.link/LWG3545 for background and details. | ||
8 | |||
9 | Differential Revision: https://reviews.llvm.org/D158922 | ||
10 | |||
11 | Upstream-Status: Backport [https://github.com/llvm/llvm-project/pull/65177] | ||
12 | --- | ||
13 | libcxx/docs/Status/Cxx23Issues.csv | 2 +- | ||
14 | libcxx/include/__memory/pointer_traits.h | 17 +- | ||
15 | .../contiguous_iterator.verify.cpp | 54 ---- | ||
16 | ...to_address_without_pointer_traits.pass.cpp | 66 ++++ | ||
17 | .../pointer.traits/difference_type.pass.cpp | 28 -- | ||
18 | .../pointer.traits/element_type.pass.cpp | 28 -- | ||
19 | .../memory/pointer.traits/pointer.pass.cpp | 35 --- | ||
20 | .../memory/pointer.traits/rebind.pass.cpp | 32 -- | ||
21 | .../pointer.traits/types.compile.pass.cpp | 289 ++++++++++++++++++ | ||
22 | 9 files changed, 367 insertions(+), 184 deletions(-) | ||
23 | delete mode 100644 libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/iterator.concept.random.access/contiguous_iterator.verify.cpp | ||
24 | create mode 100644 libcxx/test/std/utilities/memory/pointer.conversion/to_address_without_pointer_traits.pass.cpp | ||
25 | delete mode 100644 libcxx/test/std/utilities/memory/pointer.traits/difference_type.pass.cpp | ||
26 | delete mode 100644 libcxx/test/std/utilities/memory/pointer.traits/element_type.pass.cpp | ||
27 | delete mode 100644 libcxx/test/std/utilities/memory/pointer.traits/pointer.pass.cpp | ||
28 | delete mode 100644 libcxx/test/std/utilities/memory/pointer.traits/rebind.pass.cpp | ||
29 | create mode 100644 libcxx/test/std/utilities/memory/pointer.traits/types.compile.pass.cpp | ||
30 | |||
31 | diff --git a/libcxx/docs/Status/Cxx23Issues.csv b/libcxx/docs/Status/Cxx23Issues.csv | ||
32 | index 0cc06674bda3..dc96fb2e0b50 100644 | ||
33 | --- a/libcxx/docs/Status/Cxx23Issues.csv | ||
34 | +++ b/libcxx/docs/Status/Cxx23Issues.csv | ||
35 | @@ -190,7 +190,7 @@ | ||
36 | "`3118 <https://wg21.link/LWG3118>`__","``fpos`` equality comparison unspecified", "November 2022","","","" | ||
37 | "`3177 <https://wg21.link/LWG3177>`__","Limit permission to specialize variable templates to program-defined types", "November 2022","|Nothing to do|","","" | ||
38 | "`3515 <https://wg21.link/LWG3515>`__","§[stacktrace.basic.nonmem]: ``operator<<`` should be less templatized", "November 2022","","","" | ||
39 | -"`3545 <https://wg21.link/LWG3545>`__","``std::pointer_traits`` should be SFINAE-friendly", "November 2022","","","" | ||
40 | +"`3545 <https://wg21.link/LWG3545>`__","``std::pointer_traits`` should be SFINAE-friendly", "November 2022","|Complete|","18.0","" | ||
41 | "`3569 <https://wg21.link/LWG3569>`__","``join_view`` fails to support ranges of ranges with non-default_initializable iterators", "November 2022","","","|ranges|" | ||
42 | "`3594 <https://wg21.link/LWG3594>`__","``inout_ptr`` — inconsistent ``release()`` in destructor", "November 2022","","","" | ||
43 | "`3597 <https://wg21.link/LWG3597>`__","Unsigned integer types don't model advanceable", "November 2022","","","|ranges|" | ||
44 | diff --git a/libcxx/include/__memory/pointer_traits.h b/libcxx/include/__memory/pointer_traits.h | ||
45 | index c33e7bd43f29..7617948ed76b 100644 | ||
46 | --- a/libcxx/include/__memory/pointer_traits.h | ||
47 | +++ b/libcxx/include/__memory/pointer_traits.h | ||
48 | @@ -35,7 +35,7 @@ template <class _Tp> | ||
49 | struct __has_element_type<_Tp, __void_t<typename _Tp::element_type> > : true_type {}; | ||
50 | |||
51 | template <class _Ptr, bool = __has_element_type<_Ptr>::value> | ||
52 | -struct __pointer_traits_element_type; | ||
53 | +struct __pointer_traits_element_type {}; | ||
54 | |||
55 | template <class _Ptr> | ||
56 | struct __pointer_traits_element_type<_Ptr, true> | ||
57 | @@ -111,12 +111,14 @@ struct __pointer_traits_rebind<_Sp<_Tp, _Args...>, _Up, false> | ||
58 | typedef _Sp<_Up, _Args...> type; | ||
59 | }; | ||
60 | |||
61 | +template <class _Ptr, class = void> | ||
62 | +struct __pointer_traits_impl {}; | ||
63 | + | ||
64 | template <class _Ptr> | ||
65 | -struct _LIBCPP_TEMPLATE_VIS pointer_traits | ||
66 | -{ | ||
67 | - typedef _Ptr pointer; | ||
68 | - typedef typename __pointer_traits_element_type<pointer>::type element_type; | ||
69 | - typedef typename __pointer_traits_difference_type<pointer>::type difference_type; | ||
70 | +struct __pointer_traits_impl<_Ptr, __void_t<typename __pointer_traits_element_type<_Ptr>::type> > { | ||
71 | + typedef _Ptr pointer; | ||
72 | + typedef typename __pointer_traits_element_type<pointer>::type element_type; | ||
73 | + typedef typename __pointer_traits_difference_type<pointer>::type difference_type; | ||
74 | |||
75 | #ifndef _LIBCPP_CXX03_LANG | ||
76 | template <class _Up> using rebind = typename __pointer_traits_rebind<pointer, _Up>::type; | ||
77 | @@ -133,6 +135,9 @@ public: | ||
78 | {return pointer::pointer_to(__r);} | ||
79 | }; | ||
80 | |||
81 | +template <class _Ptr> | ||
82 | +struct _LIBCPP_TEMPLATE_VIS pointer_traits : __pointer_traits_impl<_Ptr> {}; | ||
83 | + | ||
84 | template <class _Tp> | ||
85 | struct _LIBCPP_TEMPLATE_VIS pointer_traits<_Tp*> | ||
86 | { | ||
87 | diff --git a/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/iterator.concept.random.access/contiguous_iterator.verify.cpp b/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/iterator.concept.random.access/contiguous_iterator.verify.cpp | ||
88 | deleted file mode 100644 | ||
89 | index 37c5ad9610a6..000000000000 | ||
90 | --- a/libcxx/test/libcxx/iterators/iterator.requirements/iterator.concepts/iterator.concept.random.access/contiguous_iterator.verify.cpp | ||
91 | +++ /dev/null | ||
92 | @@ -1,54 +0,0 @@ | ||
93 | -//===----------------------------------------------------------------------===// | ||
94 | -// | ||
95 | -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
96 | -// See https://llvm.org/LICENSE.txt for license information. | ||
97 | -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
98 | -// | ||
99 | -//===----------------------------------------------------------------------===// | ||
100 | - | ||
101 | -// UNSUPPORTED: c++03, c++11, c++14, c++17 | ||
102 | - | ||
103 | -// This test checks that std::contiguous_iterator uses std::to_address, which is not SFINAE-friendly | ||
104 | -// when the type is missing the `T::element_type` typedef. | ||
105 | - | ||
106 | -#include <iterator> | ||
107 | - | ||
108 | -#include <compare> | ||
109 | -#include <cstddef> | ||
110 | - | ||
111 | -struct no_element_type { | ||
112 | - typedef std::contiguous_iterator_tag iterator_category; | ||
113 | - typedef int value_type; | ||
114 | - typedef std::ptrdiff_t difference_type; | ||
115 | - typedef int* pointer; | ||
116 | - typedef int& reference; | ||
117 | - typedef no_element_type self; | ||
118 | - | ||
119 | - no_element_type(); | ||
120 | - | ||
121 | - reference operator*() const; | ||
122 | - pointer operator->() const; | ||
123 | - auto operator<=>(const self&) const = default; | ||
124 | - | ||
125 | - self& operator++(); | ||
126 | - self operator++(int); | ||
127 | - | ||
128 | - self& operator--(); | ||
129 | - self operator--(int); | ||
130 | - | ||
131 | - self& operator+=(difference_type n); | ||
132 | - self operator+(difference_type n) const; | ||
133 | - friend self operator+(difference_type n, self x); | ||
134 | - | ||
135 | - self& operator-=(difference_type n); | ||
136 | - self operator-(difference_type n) const; | ||
137 | - difference_type operator-(const self& n) const; | ||
138 | - | ||
139 | - reference operator[](difference_type n) const; | ||
140 | -}; | ||
141 | - | ||
142 | -void test() { | ||
143 | - (void) std::contiguous_iterator<no_element_type>; | ||
144 | - // expected-error@*:* {{implicit instantiation of undefined template}} | ||
145 | - // expected-note@*:* {{to_address}} | ||
146 | -} | ||
147 | diff --git a/libcxx/test/std/utilities/memory/pointer.conversion/to_address_without_pointer_traits.pass.cpp b/libcxx/test/std/utilities/memory/pointer.conversion/to_address_without_pointer_traits.pass.cpp | ||
148 | new file mode 100644 | ||
149 | index 000000000000..4d05c10e0fbd | ||
150 | --- /dev/null | ||
151 | +++ b/libcxx/test/std/utilities/memory/pointer.conversion/to_address_without_pointer_traits.pass.cpp | ||
152 | @@ -0,0 +1,66 @@ | ||
153 | +//===----------------------------------------------------------------------===// | ||
154 | +// | ||
155 | +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
156 | +// See https://llvm.org/LICENSE.txt for license information. | ||
157 | +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
158 | +// | ||
159 | +//===----------------------------------------------------------------------===// | ||
160 | + | ||
161 | +// <memory> | ||
162 | + | ||
163 | +// UNSUPPORTED: c++03, c++11, c++14, c++17 | ||
164 | + | ||
165 | +// template <class Ptr> constexpr auto to_address(const Ptr& p) noexcept; | ||
166 | +// Should not require a specialization of pointer_traits for Ptr. | ||
167 | + | ||
168 | +#include <memory> | ||
169 | +#include <type_traits> | ||
170 | +#include <utility> | ||
171 | + | ||
172 | +struct IntPtr { | ||
173 | + constexpr int* operator->() const { return ptr; } | ||
174 | + | ||
175 | + int* ptr; | ||
176 | +}; | ||
177 | + | ||
178 | +template <class T, bool> | ||
179 | +struct TemplatedPtr { | ||
180 | + constexpr T* operator->() const { return ptr; } | ||
181 | + | ||
182 | + T* ptr; | ||
183 | +}; | ||
184 | + | ||
185 | +template <template <class...> class Templ, class Ignore, class... Args> | ||
186 | +struct is_valid_expansion_impl : std::false_type {}; | ||
187 | + | ||
188 | +template <template <class...> class Templ, class... Args> | ||
189 | +struct is_valid_expansion_impl<Templ, decltype((void)Templ<Args...>{}, 0), Args...> : std::true_type {}; | ||
190 | + | ||
191 | +template <template <class...> class Templ, class... Args> | ||
192 | +using is_valid_expansion = is_valid_expansion_impl<Templ, int, Args...>; | ||
193 | + | ||
194 | +template <class Ptr> | ||
195 | +using TestToAddressCall = decltype(std::to_address(std::declval<Ptr>())); | ||
196 | + | ||
197 | +constexpr bool test() { | ||
198 | + int i = 0; | ||
199 | + | ||
200 | + static_assert(std::to_address(IntPtr{nullptr}) == nullptr); | ||
201 | + static_assert(std::to_address(IntPtr{&i}) == &i); | ||
202 | + | ||
203 | + bool b = false; | ||
204 | + | ||
205 | + static_assert(std::to_address(TemplatedPtr<bool, true>{nullptr}) == nullptr); | ||
206 | + static_assert(std::to_address(TemplatedPtr<bool, true>{&b}) == &b); | ||
207 | + | ||
208 | + static_assert(!is_valid_expansion<TestToAddressCall, int>::value); | ||
209 | + static_assert(is_valid_expansion<TestToAddressCall, IntPtr>::value); | ||
210 | + static_assert(is_valid_expansion<TestToAddressCall, TemplatedPtr<bool, true>>::value); | ||
211 | + | ||
212 | + return true; | ||
213 | +} | ||
214 | + | ||
215 | +int main(int, char**) { | ||
216 | + static_assert(test()); | ||
217 | + return 0; | ||
218 | +} | ||
219 | diff --git a/libcxx/test/std/utilities/memory/pointer.traits/difference_type.pass.cpp b/libcxx/test/std/utilities/memory/pointer.traits/difference_type.pass.cpp | ||
220 | deleted file mode 100644 | ||
221 | index 7546df902882..000000000000 | ||
222 | --- a/libcxx/test/std/utilities/memory/pointer.traits/difference_type.pass.cpp | ||
223 | +++ /dev/null | ||
224 | @@ -1,28 +0,0 @@ | ||
225 | -//===----------------------------------------------------------------------===// | ||
226 | -// | ||
227 | -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
228 | -// See https://llvm.org/LICENSE.txt for license information. | ||
229 | -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
230 | -// | ||
231 | -//===----------------------------------------------------------------------===// | ||
232 | - | ||
233 | -// <memory> | ||
234 | - | ||
235 | -// template <class T> | ||
236 | -// struct pointer_traits<T*> | ||
237 | -// { | ||
238 | -// typedef ptrdiff_t difference_type; | ||
239 | -// ... | ||
240 | -// }; | ||
241 | - | ||
242 | -#include <memory> | ||
243 | -#include <type_traits> | ||
244 | - | ||
245 | -#include "test_macros.h" | ||
246 | - | ||
247 | -int main(int, char**) | ||
248 | -{ | ||
249 | - static_assert((std::is_same<std::pointer_traits<double*>::difference_type, std::ptrdiff_t>::value), ""); | ||
250 | - | ||
251 | - return 0; | ||
252 | -} | ||
253 | diff --git a/libcxx/test/std/utilities/memory/pointer.traits/element_type.pass.cpp b/libcxx/test/std/utilities/memory/pointer.traits/element_type.pass.cpp | ||
254 | deleted file mode 100644 | ||
255 | index e4f11c28e29b..000000000000 | ||
256 | --- a/libcxx/test/std/utilities/memory/pointer.traits/element_type.pass.cpp | ||
257 | +++ /dev/null | ||
258 | @@ -1,28 +0,0 @@ | ||
259 | -//===----------------------------------------------------------------------===// | ||
260 | -// | ||
261 | -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
262 | -// See https://llvm.org/LICENSE.txt for license information. | ||
263 | -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
264 | -// | ||
265 | -//===----------------------------------------------------------------------===// | ||
266 | - | ||
267 | -// <memory> | ||
268 | - | ||
269 | -// template <class T> | ||
270 | -// struct pointer_traits<T*> | ||
271 | -// { | ||
272 | -// typedef T element_type; | ||
273 | -// ... | ||
274 | -// }; | ||
275 | - | ||
276 | -#include <memory> | ||
277 | -#include <type_traits> | ||
278 | - | ||
279 | -#include "test_macros.h" | ||
280 | - | ||
281 | -int main(int, char**) | ||
282 | -{ | ||
283 | - static_assert((std::is_same<std::pointer_traits<const short*>::element_type, const short>::value), ""); | ||
284 | - | ||
285 | - return 0; | ||
286 | -} | ||
287 | diff --git a/libcxx/test/std/utilities/memory/pointer.traits/pointer.pass.cpp b/libcxx/test/std/utilities/memory/pointer.traits/pointer.pass.cpp | ||
288 | deleted file mode 100644 | ||
289 | index 14054b3c4f65..000000000000 | ||
290 | --- a/libcxx/test/std/utilities/memory/pointer.traits/pointer.pass.cpp | ||
291 | +++ /dev/null | ||
292 | @@ -1,35 +0,0 @@ | ||
293 | -//===----------------------------------------------------------------------===// | ||
294 | -// | ||
295 | -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
296 | -// See https://llvm.org/LICENSE.txt for license information. | ||
297 | -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
298 | -// | ||
299 | -//===----------------------------------------------------------------------===// | ||
300 | - | ||
301 | -// <memory> | ||
302 | - | ||
303 | -// template <class Ptr> | ||
304 | -// struct pointer_traits | ||
305 | -// { | ||
306 | -// typedef Ptr pointer; | ||
307 | -// ... | ||
308 | -// }; | ||
309 | - | ||
310 | -#include <memory> | ||
311 | -#include <type_traits> | ||
312 | - | ||
313 | -#include "test_macros.h" | ||
314 | - | ||
315 | -struct A | ||
316 | -{ | ||
317 | - typedef short element_type; | ||
318 | - typedef char difference_type; | ||
319 | -}; | ||
320 | - | ||
321 | -int main(int, char**) | ||
322 | -{ | ||
323 | - static_assert((std::is_same<std::pointer_traits<A>::pointer, A>::value), ""); | ||
324 | - static_assert((std::is_same<std::pointer_traits<int*>::pointer, int*>::value), ""); | ||
325 | - | ||
326 | - return 0; | ||
327 | -} | ||
328 | diff --git a/libcxx/test/std/utilities/memory/pointer.traits/rebind.pass.cpp b/libcxx/test/std/utilities/memory/pointer.traits/rebind.pass.cpp | ||
329 | deleted file mode 100644 | ||
330 | index f64213c9b887..000000000000 | ||
331 | --- a/libcxx/test/std/utilities/memory/pointer.traits/rebind.pass.cpp | ||
332 | +++ /dev/null | ||
333 | @@ -1,32 +0,0 @@ | ||
334 | -//===----------------------------------------------------------------------===// | ||
335 | -// | ||
336 | -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
337 | -// See https://llvm.org/LICENSE.txt for license information. | ||
338 | -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
339 | -// | ||
340 | -//===----------------------------------------------------------------------===// | ||
341 | - | ||
342 | -// <memory> | ||
343 | - | ||
344 | -// template <class T> | ||
345 | -// struct pointer_traits<T*> | ||
346 | -// { | ||
347 | -// template <class U> using rebind = U*; | ||
348 | -// ... | ||
349 | -// }; | ||
350 | - | ||
351 | -#include <memory> | ||
352 | -#include <type_traits> | ||
353 | - | ||
354 | -#include "test_macros.h" | ||
355 | - | ||
356 | -int main(int, char**) | ||
357 | -{ | ||
358 | -#if TEST_STD_VER >= 11 | ||
359 | - static_assert((std::is_same<std::pointer_traits<int*>::rebind<double>, double*>::value), ""); | ||
360 | -#else | ||
361 | - static_assert((std::is_same<std::pointer_traits<int*>::rebind<double>::other, double*>::value), ""); | ||
362 | -#endif | ||
363 | - | ||
364 | - return 0; | ||
365 | -} | ||
366 | diff --git a/libcxx/test/std/utilities/memory/pointer.traits/types.compile.pass.cpp b/libcxx/test/std/utilities/memory/pointer.traits/types.compile.pass.cpp | ||
367 | new file mode 100644 | ||
368 | index 000000000000..19461508ca0f | ||
369 | --- /dev/null | ||
370 | +++ b/libcxx/test/std/utilities/memory/pointer.traits/types.compile.pass.cpp | ||
371 | @@ -0,0 +1,289 @@ | ||
372 | +//===----------------------------------------------------------------------===// | ||
373 | +// | ||
374 | +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
375 | +// See https://llvm.org/LICENSE.txt for license information. | ||
376 | +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
377 | +// | ||
378 | +//===----------------------------------------------------------------------===// | ||
379 | + | ||
380 | +// <memory> | ||
381 | + | ||
382 | +// template <class Ptr> | ||
383 | +// struct pointer_traits | ||
384 | +// { | ||
385 | +// <details> | ||
386 | +// }; | ||
387 | +// | ||
388 | +// template <class T> | ||
389 | +// struct pointer_traits<T*> | ||
390 | +// { | ||
391 | +// using pointer = T*; | ||
392 | +// using element_type = T; | ||
393 | +// using difference_type = ptrdiff_t; | ||
394 | +// template <class U> using rebind = U*; | ||
395 | +// static constexpr pointer pointer_to(<details>) noexcept; | ||
396 | +// ... | ||
397 | +// }; | ||
398 | + | ||
399 | +#include <memory> | ||
400 | +#include <type_traits> | ||
401 | + | ||
402 | +#include "test_macros.h" | ||
403 | + | ||
404 | +template <typename... Ts> | ||
405 | +struct VoidifyImpl { | ||
406 | + using type = void; | ||
407 | +}; | ||
408 | + | ||
409 | +template <typename... Ts> | ||
410 | +using Voidify = typename VoidifyImpl<Ts...>::type; | ||
411 | + | ||
412 | +template <class T, class = void> | ||
413 | +struct HasElementType : std::false_type {}; | ||
414 | + | ||
415 | +template <class T> | ||
416 | +struct HasElementType<T, Voidify<typename std::pointer_traits<T>::element_type> > : std::true_type {}; | ||
417 | + | ||
418 | +template <class T, class = void> | ||
419 | +struct HasPointerType : std::false_type {}; | ||
420 | + | ||
421 | +template <class T> | ||
422 | +struct HasPointerType<T, Voidify<typename std::pointer_traits<T>::pointer> > : std::true_type {}; | ||
423 | + | ||
424 | +template <class T, class = void> | ||
425 | +struct HasDifferenceType : std::false_type {}; | ||
426 | + | ||
427 | +template <class T> | ||
428 | +struct HasDifferenceType<T, Voidify<typename std::pointer_traits<T>::difference_type> > : std::true_type {}; | ||
429 | + | ||
430 | +template <class T, class U, class = void> | ||
431 | +struct HasRebind : std::false_type {}; | ||
432 | + | ||
433 | +template <class T, class U> | ||
434 | +struct HasRebind<T, U, Voidify<typename std::pointer_traits<T>::template rebind<U> > > : std::true_type {}; | ||
435 | + | ||
436 | +template <class T, class = void> | ||
437 | +struct HasPointerTo : std::false_type {}; | ||
438 | + | ||
439 | +template <class T> | ||
440 | +struct HasPointerTo< | ||
441 | + T, | ||
442 | + Voidify<decltype(std::pointer_traits<T>::pointer_to( | ||
443 | + std::declval<typename std::add_lvalue_reference<typename std::pointer_traits<T>::element_type>::type>()))> > | ||
444 | + : std::true_type {}; | ||
445 | + | ||
446 | +struct Irrelevant; | ||
447 | + | ||
448 | +struct NotAPtr {}; | ||
449 | + | ||
450 | +struct LongPtr {}; | ||
451 | + | ||
452 | +int global_int; | ||
453 | + | ||
454 | +template <class T, class Arg> | ||
455 | +struct TemplatedPtr; | ||
456 | + | ||
457 | +struct PtrWithElementType { | ||
458 | + using element_type = int; | ||
459 | + template <class U> | ||
460 | +#if TEST_STD_VER >= 11 | ||
461 | + using rebind = TemplatedPtr<U, Irrelevant>; | ||
462 | +#else | ||
463 | + struct rebind { | ||
464 | + using other = TemplatedPtr<U, Irrelevant>; | ||
465 | + }; | ||
466 | +#endif | ||
467 | + static TEST_CONSTEXPR_CXX14 PtrWithElementType pointer_to(element_type&) { return {&global_int}; } | ||
468 | + int* ptr; | ||
469 | +}; | ||
470 | + | ||
471 | +template <class T, class Arg> | ||
472 | +struct TemplatedPtr { | ||
473 | + template <class U, class = typename std::enable_if<std::is_same<long, U>::value>::type> | ||
474 | +#if TEST_STD_VER >= 11 | ||
475 | + using rebind = LongPtr; | ||
476 | +#else | ||
477 | + struct rebind { | ||
478 | + using other = LongPtr; | ||
479 | + }; | ||
480 | +#endif | ||
481 | + static TEST_CONSTEXPR_CXX14 TemplatedPtr pointer_to(T&) { return {&global_int}; } | ||
482 | + | ||
483 | + T* ptr; | ||
484 | +}; | ||
485 | + | ||
486 | +template <class T, class Arg> | ||
487 | +struct TemplatedPtrWithElementType { | ||
488 | + using element_type = int; | ||
489 | +#if TEST_STD_VER >= 11 | ||
490 | + template <class U, class = typename std::enable_if<std::is_same<long, U>::value>::type> | ||
491 | + using rebind = LongPtr; | ||
492 | +#else | ||
493 | + template <class U, class = typename std::enable_if<std::is_same<long, U>::value>::type> | ||
494 | + struct rebind { | ||
495 | + using other = LongPtr; | ||
496 | + }; | ||
497 | +#endif | ||
498 | + static TEST_CONSTEXPR_CXX14 TemplatedPtrWithElementType pointer_to(element_type&) { return {&global_int}; } | ||
499 | + | ||
500 | + element_type* ptr; | ||
501 | +}; | ||
502 | + | ||
503 | +int main() { | ||
504 | + { | ||
505 | + using Ptr = NotAPtr; | ||
506 | + static_assert(!HasElementType<Ptr>::value, ""); | ||
507 | + static_assert(!HasPointerType<Ptr>::value, ""); | ||
508 | + static_assert(!HasDifferenceType<Ptr>::value, ""); | ||
509 | + static_assert(!HasRebind<Ptr, long>::value, ""); | ||
510 | + static_assert(!HasPointerTo<Ptr>::value, ""); | ||
511 | + } | ||
512 | + | ||
513 | + { | ||
514 | + using Ptr = int*; | ||
515 | + | ||
516 | + static_assert(HasElementType<Ptr>::value, ""); | ||
517 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::element_type, int); | ||
518 | + | ||
519 | + static_assert(HasPointerType<Ptr>::value, ""); | ||
520 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::pointer, Ptr); | ||
521 | + | ||
522 | + static_assert(HasDifferenceType<Ptr>::value, ""); | ||
523 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::difference_type, ptrdiff_t); | ||
524 | + | ||
525 | + static_assert(HasRebind<Ptr, long>::value, ""); | ||
526 | +#if TEST_STD_VER >= 11 | ||
527 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::rebind<long>, long*); | ||
528 | +#else | ||
529 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::rebind<long>::other, long*); | ||
530 | +#endif | ||
531 | + | ||
532 | + static_assert(HasPointerTo<Ptr>::value, ""); | ||
533 | + int variable = 0; | ||
534 | + ASSERT_SAME_TYPE(decltype(std::pointer_traits<Ptr>::pointer_to(variable)), Ptr); | ||
535 | +#if TEST_STD_VER >= 20 | ||
536 | + static_assert(std::pointer_traits<Ptr>::pointer_to(variable) == &variable, ""); | ||
537 | +#endif | ||
538 | + } | ||
539 | + | ||
540 | + { | ||
541 | + using Ptr = const int*; | ||
542 | + | ||
543 | + static_assert(HasElementType<Ptr>::value, ""); | ||
544 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::element_type, const int); | ||
545 | + | ||
546 | + static_assert(HasPointerType<Ptr>::value, ""); | ||
547 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::pointer, Ptr); | ||
548 | + | ||
549 | + static_assert(HasDifferenceType<Ptr>::value, ""); | ||
550 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::difference_type, ptrdiff_t); | ||
551 | + | ||
552 | + static_assert(HasRebind<Ptr, long>::value, ""); | ||
553 | +#if TEST_STD_VER >= 11 | ||
554 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::rebind<long>, long*); | ||
555 | +#else | ||
556 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::rebind<long>::other, long*); | ||
557 | +#endif | ||
558 | + | ||
559 | + static_assert(HasPointerTo<Ptr>::value, ""); | ||
560 | + const int const_variable = 0; | ||
561 | + ASSERT_SAME_TYPE(decltype(std::pointer_traits<Ptr>::pointer_to(const_variable)), Ptr); | ||
562 | +#if TEST_STD_VER >= 20 | ||
563 | + static_assert(std::pointer_traits<Ptr>::pointer_to(const_variable) == &const_variable, ""); | ||
564 | +#endif | ||
565 | + int variable = 0; | ||
566 | + ASSERT_SAME_TYPE(decltype(std::pointer_traits<Ptr>::pointer_to(variable)), Ptr); | ||
567 | +#if TEST_STD_VER >= 20 | ||
568 | + static_assert(std::pointer_traits<Ptr>::pointer_to(variable) == &variable, ""); | ||
569 | +#endif | ||
570 | + } | ||
571 | + | ||
572 | + { | ||
573 | + using Ptr = PtrWithElementType; | ||
574 | + | ||
575 | + static_assert(HasElementType<Ptr>::value, ""); | ||
576 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::element_type, int); | ||
577 | + | ||
578 | + static_assert(HasPointerType<Ptr>::value, ""); | ||
579 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::pointer, Ptr); | ||
580 | + | ||
581 | + static_assert(HasDifferenceType<Ptr>::value, ""); | ||
582 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::difference_type, ptrdiff_t); | ||
583 | + | ||
584 | + static_assert(HasRebind<Ptr, long>::value, ""); | ||
585 | +#if TEST_STD_VER >= 11 | ||
586 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::rebind<long>, TemplatedPtr<long, Irrelevant>); | ||
587 | +#else | ||
588 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::rebind<long>::other, TemplatedPtr<long, Irrelevant>); | ||
589 | +#endif | ||
590 | + | ||
591 | + static_assert(HasPointerTo<Ptr>::value, ""); | ||
592 | + int ignored = 0; | ||
593 | + ASSERT_SAME_TYPE(decltype(std::pointer_traits<Ptr>::pointer_to(ignored)), Ptr); | ||
594 | +#if TEST_STD_VER >= 20 | ||
595 | + static_assert(std::pointer_traits<Ptr>::pointer_to(ignored).ptr == &global_int, ""); | ||
596 | +#endif | ||
597 | + } | ||
598 | + | ||
599 | + { | ||
600 | + using Ptr = TemplatedPtr<int, Irrelevant>; | ||
601 | + | ||
602 | + static_assert(HasElementType<Ptr>::value, ""); | ||
603 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::element_type, int); | ||
604 | + | ||
605 | + static_assert(HasPointerType<Ptr>::value, ""); | ||
606 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::pointer, Ptr); | ||
607 | + | ||
608 | + static_assert(HasDifferenceType<Ptr>::value, ""); | ||
609 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::difference_type, ptrdiff_t); | ||
610 | + | ||
611 | + static_assert(HasRebind<Ptr, long>::value, ""); | ||
612 | + static_assert(HasRebind<Ptr, long long>::value, ""); | ||
613 | +#if TEST_STD_VER >= 11 | ||
614 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::rebind<long>, LongPtr); | ||
615 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::rebind<long long>, TemplatedPtr<long long, Irrelevant>); | ||
616 | +#else | ||
617 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::rebind<long>::other, LongPtr); | ||
618 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::rebind<long long>::other, TemplatedPtr<long long, Irrelevant>); | ||
619 | +#endif | ||
620 | + | ||
621 | + static_assert(HasPointerTo<Ptr>::value, ""); | ||
622 | + int ignored = 0; | ||
623 | + ASSERT_SAME_TYPE(decltype(std::pointer_traits<Ptr>::pointer_to(ignored)), Ptr); | ||
624 | +#if TEST_STD_VER >= 20 | ||
625 | + static_assert(std::pointer_traits<Ptr>::pointer_to(ignored).ptr == &global_int, ""); | ||
626 | +#endif | ||
627 | + } | ||
628 | + | ||
629 | + { | ||
630 | + using Ptr = TemplatedPtrWithElementType<Irrelevant, Irrelevant>; | ||
631 | + | ||
632 | + static_assert(HasElementType<Ptr>::value, ""); | ||
633 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::element_type, int); | ||
634 | + | ||
635 | + static_assert(HasPointerType<Ptr>::value, ""); | ||
636 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::pointer, Ptr); | ||
637 | + | ||
638 | + static_assert(HasDifferenceType<Ptr>::value, ""); | ||
639 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::difference_type, ptrdiff_t); | ||
640 | + | ||
641 | + static_assert(HasRebind<Ptr, long>::value, ""); | ||
642 | + static_assert(HasRebind<Ptr, long long>::value, ""); | ||
643 | +#if TEST_STD_VER >= 11 | ||
644 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::rebind<long>, LongPtr); | ||
645 | + ASSERT_SAME_TYPE( | ||
646 | + typename std::pointer_traits<Ptr>::rebind<long long>, TemplatedPtrWithElementType<long long, Irrelevant>); | ||
647 | +#else | ||
648 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::rebind<long>::other, LongPtr); | ||
649 | + ASSERT_SAME_TYPE(typename std::pointer_traits<Ptr>::rebind<long long>::other, | ||
650 | + TemplatedPtrWithElementType<long long, Irrelevant>); | ||
651 | +#endif | ||
652 | + | ||
653 | + static_assert(HasPointerTo<Ptr>::value, ""); | ||
654 | + int ignored = 0; | ||
655 | + ASSERT_SAME_TYPE(decltype(std::pointer_traits<Ptr>::pointer_to(ignored)), Ptr); | ||
656 | +#if TEST_STD_VER >= 20 | ||
657 | + static_assert(std::pointer_traits<Ptr>::pointer_to(ignored).ptr == &global_int, ""); | ||
658 | +#endif | ||
659 | + } | ||
660 | +} | ||
diff --git a/recipes-devtools/clang/common.inc b/recipes-devtools/clang/common.inc index aaf7e7d..c004d16 100644 --- a/recipes-devtools/clang/common.inc +++ b/recipes-devtools/clang/common.inc | |||
@@ -43,6 +43,7 @@ SRC_URI = "\ | |||
43 | file://0032-compiler-rt-Fix-stat-struct-s-size-for-O32-ABI.patch \ | 43 | file://0032-compiler-rt-Fix-stat-struct-s-size-for-O32-ABI.patch \ |
44 | file://0033-compiler-rt-Undef-_TIME_BITS-along-with-_FILE_OFFSET.patch \ | 44 | file://0033-compiler-rt-Undef-_TIME_BITS-along-with-_FILE_OFFSET.patch \ |
45 | file://0034-ToolChains-Gnu.cpp-ARMLibDirs-search-also-in-lib32.patch \ | 45 | file://0034-ToolChains-Gnu.cpp-ARMLibDirs-search-also-in-lib32.patch \ |
46 | file://0035-libcxx-Implement-LWG3545-std-pointer_traits-should-be-.patch \ | ||
46 | " | 47 | " |
47 | # Fallback to no-PIE if not set | 48 | # Fallback to no-PIE if not set |
48 | GCCPIE ??= "" | 49 | GCCPIE ??= "" |