libstdc++: Add missing constexpr to uses-allocator construction utilities [PR104542]
libstdc++-v3/ChangeLog: PR libstdc++/104542 * include/bits/uses_allocator_args.h (make_obj_using_allocator) (uninitialized_construct_using_allocator): Add constexpr. * testsuite/20_util/uses_allocator/make_obj.cc: Check constexpr. * testsuite/20_util/uses_allocator/uninitialized_construct.cc: New test.
This commit is contained in:
parent
d03a67dc69
commit
6cfb7ffb65
3 changed files with 48 additions and 3 deletions
|
@ -196,7 +196,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
}
|
||||
|
||||
template<typename _Tp, typename _Alloc, typename... _Args>
|
||||
inline _Tp
|
||||
constexpr _Tp
|
||||
make_obj_using_allocator(const _Alloc& __a, _Args&&... __args)
|
||||
{
|
||||
return std::make_from_tuple<_Tp>(
|
||||
|
@ -205,7 +205,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
}
|
||||
|
||||
template<typename _Tp, typename _Alloc, typename... _Args>
|
||||
inline _Tp*
|
||||
constexpr _Tp*
|
||||
uninitialized_construct_using_allocator(_Tp* __p, const _Alloc& __a,
|
||||
_Args&&... __args)
|
||||
{
|
||||
|
|
|
@ -142,7 +142,7 @@ test01()
|
|||
VERIFY( c2.alloc_id == 1 );
|
||||
}
|
||||
|
||||
void
|
||||
void
|
||||
test02()
|
||||
{
|
||||
decltype(auto) b
|
||||
|
@ -389,6 +389,34 @@ test08()
|
|||
std::make_obj_using_allocator<X>(a);
|
||||
}
|
||||
|
||||
constexpr bool
|
||||
test_pr104542()
|
||||
{
|
||||
// PR libstdc++/104542 - missing constexpr
|
||||
std::allocator<void> a;
|
||||
int i = std::make_obj_using_allocator<int>(a, 1);
|
||||
|
||||
struct X {
|
||||
using allocator_type = std::allocator<long>;
|
||||
constexpr X(std::allocator_arg_t, std::allocator<int>, int i) : i(i+1) { }
|
||||
int i;
|
||||
};
|
||||
|
||||
X x = std::make_obj_using_allocator<X>(a, i);
|
||||
|
||||
struct Y {
|
||||
using allocator_type = std::allocator<char>;
|
||||
constexpr Y(X x, std::allocator<int>) : i(x.i+1) { }
|
||||
int i;
|
||||
};
|
||||
|
||||
Y y = std::make_obj_using_allocator<Y>(a, x);
|
||||
|
||||
return y.i == 3;
|
||||
}
|
||||
|
||||
static_assert( test_pr104542() );
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
// { dg-options "-std=gnu++20" }
|
||||
// { dg-do compile { target c++20 } }
|
||||
|
||||
#include <memory>
|
||||
|
||||
constexpr bool
|
||||
test_pr104542()
|
||||
{
|
||||
// PR libstdc++/104542 - missing constexpr
|
||||
std::allocator<int> a;
|
||||
int* p = a.allocate(1);
|
||||
int i = *std::uninitialized_construct_using_allocator<int>(p, a, 999);
|
||||
a.deallocate(p, 1);
|
||||
return i == 999;
|
||||
}
|
||||
|
||||
static_assert( test_pr104542() );
|
Loading…
Add table
Reference in a new issue