Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/g++.dg/cpp2a/constexpr-new6.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 inline namespace _8 { } | |
7 namespace _8 { | |
8 | |
9 typedef __SIZE_TYPE__ size_t; | |
10 | |
11 template <typename T> | |
12 struct allocator | |
13 { | |
14 constexpr allocator () noexcept {} | |
15 | |
16 constexpr T *allocate (size_t n) | |
17 { return static_cast<T *> (::operator new (n * sizeof(T))); } | |
18 | |
19 constexpr void | |
20 deallocate (T *p, size_t n) | |
21 { ::operator delete (p); } | |
22 }; | |
23 | |
24 template <typename T, typename U = T &&> | |
25 U __declval (int); | |
26 template <typename T> | |
27 T __declval (long); | |
28 template <typename T> | |
29 auto declval () noexcept -> decltype (__declval<T> (0)); | |
30 | |
31 template <typename T> | |
32 struct remove_reference | |
33 { typedef T type; }; | |
34 template <typename T> | |
35 struct remove_reference<T &> | |
36 { typedef T type; }; | |
37 template <typename T> | |
38 struct remove_reference<T &&> | |
39 { typedef T type; }; | |
40 | |
41 template <typename T> | |
42 constexpr T && | |
43 forward (typename std::remove_reference<T>::type &t) noexcept | |
44 { return static_cast<T&&> (t); } | |
45 | |
46 template<typename T> | |
47 constexpr T && | |
48 forward (typename std::remove_reference<T>::type &&t) noexcept | |
49 { return static_cast<T&&> (t); } | |
50 | |
51 template <typename T, typename... A> | |
52 constexpr auto | |
53 construct_at (T *l, A &&... a) | |
54 noexcept (noexcept (::new ((void *) 0) T (std::declval<A> ()...))) | |
55 -> decltype (::new ((void *) 0) T (std::declval<A> ()...)) | |
56 { return ::new ((void *) l) T (std::forward<A> (a)...); } | |
57 | |
58 template <typename T> | |
59 constexpr inline void | |
60 destroy_at (T *l) | |
61 { l->~T (); } | |
62 } | |
63 } | |
64 | |
65 inline void *operator new (std::size_t, void *p) noexcept | |
66 { return p; } | |
67 | |
68 constexpr bool | |
69 foo () | |
70 { | |
71 std::allocator<int> a; | |
72 auto p = a.allocate (2); | |
73 std::construct_at (p, 1); | |
74 std::construct_at (p + 1, 2); | |
75 if (p[0] != 1 || p[1] != 2) | |
76 throw 1; | |
77 std::destroy_at (p); | |
78 std::destroy_at (p + 1); | |
79 a.deallocate (p, 2); | |
80 return true; | |
81 } | |
82 | |
83 static_assert (foo ()); |