Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/g++.dg/cpp2a/constexpr-new5.C @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
131:84e7813d76e9 | 145:1830386684a0 |
---|---|
1 // P0784R7 | |
2 // { dg-do compile { target c++2a } } | |
3 | |
4 namespace std | |
5 { | |
6 typedef __SIZE_TYPE__ size_t; | |
7 | |
8 template <typename T> | |
9 struct allocator | |
10 { | |
11 constexpr allocator () noexcept {} | |
12 | |
13 constexpr T *allocate (size_t n) | |
14 { return static_cast<T *> (::operator new (n * sizeof(T))); } | |
15 | |
16 constexpr void | |
17 deallocate (T *p, size_t n) | |
18 { ::operator delete (p); } | |
19 }; | |
20 | |
21 template <typename T, typename U = T &&> | |
22 U __declval (int); | |
23 template <typename T> | |
24 T __declval (long); | |
25 template <typename T> | |
26 auto declval () noexcept -> decltype (__declval<T> (0)); | |
27 | |
28 template <typename T> | |
29 struct remove_reference | |
30 { typedef T type; }; | |
31 template <typename T> | |
32 struct remove_reference<T &> | |
33 { typedef T type; }; | |
34 template <typename T> | |
35 struct remove_reference<T &&> | |
36 { typedef T type; }; | |
37 | |
38 template <typename T> | |
39 constexpr T && | |
40 forward (typename std::remove_reference<T>::type &t) noexcept | |
41 { return static_cast<T&&> (t); } | |
42 | |
43 template<typename T> | |
44 constexpr T && | |
45 forward (typename std::remove_reference<T>::type &&t) noexcept | |
46 { return static_cast<T&&> (t); } | |
47 | |
48 template <typename T, typename... A> | |
49 constexpr auto | |
50 construct_at (T *l, A &&... a) | |
51 noexcept (noexcept (::new ((void *) 0) T (std::declval<A> ()...))) | |
52 -> decltype (::new ((void *) 0) T (std::declval<A> ()...)) | |
53 { return ::new ((void *) l) T (std::forward<A> (a)...); } | |
54 | |
55 template <typename T> | |
56 constexpr inline void | |
57 destroy_at (T *l) | |
58 { l->~T (); } | |
59 } | |
60 | |
61 inline void *operator new (std::size_t, void *p) noexcept | |
62 { return p; } | |
63 | |
64 constexpr bool | |
65 foo () | |
66 { | |
67 std::allocator<int> a; | |
68 auto p = a.allocate (2); | |
69 std::construct_at (p, 1); | |
70 std::construct_at (p + 1, 2); | |
71 if (p[0] != 1 || p[1] != 2) | |
72 throw 1; | |
73 std::destroy_at (p); | |
74 std::destroy_at (p + 1); | |
75 a.deallocate (p, 2); | |
76 return true; | |
77 } | |
78 | |
79 static_assert (foo ()); |