Differential D116621 Diff 439539 libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc_convert_copy.pass.cpp
Changeset View
Changeset View
Standalone View
Standalone View
libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/alloc_convert_copy.pass.cpp
//===----------------------------------------------------------------------===// | //===----------------------------------------------------------------------===// | ||||
// | // | ||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||||
// See https://llvm.org/LICENSE.txt for license information. | // See https://llvm.org/LICENSE.txt for license information. | ||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||||
// | // | ||||
//===----------------------------------------------------------------------===// | //===----------------------------------------------------------------------===// | ||||
// <tuple> | // <tuple> | ||||
// template <class... Types> class tuple; | // template <class... Types> class tuple; | ||||
// template <class Alloc, class... UTypes> | // template <class Alloc, class... UTypes> | ||||
// constexpr // since c++20 | |||||
// tuple(allocator_arg_t, const Alloc& a, const tuple<UTypes...>&); | // tuple(allocator_arg_t, const Alloc& a, const tuple<UTypes...>&); | ||||
// UNSUPPORTED: c++03 | // UNSUPPORTED: c++03 | ||||
#include <tuple> | #include <tuple> | ||||
#include <memory> | #include <memory> | ||||
#include <cassert> | #include <cassert> | ||||
#include "test_macros.h" | #include "test_macros.h" | ||||
#include "allocators.h" | #include "allocators.h" | ||||
#include "test_allocator.h" | |||||
#include "../alloc_first.h" | #include "../alloc_first.h" | ||||
#include "../alloc_last.h" | #include "../alloc_last.h" | ||||
struct Explicit { | struct Explicit { | ||||
int value; | int value; | ||||
explicit Explicit(int x) : value(x) {} | explicit Explicit(int x) : value(x) {} | ||||
}; | }; | ||||
struct Implicit { | struct Implicit { | ||||
int value; | int value; | ||||
Implicit(int x) : value(x) {} | Implicit(int x) : value(x) {} | ||||
}; | }; | ||||
#if _LIBCPP_STD_VER > 17 | |||||
constexpr bool alloc_copy_constructor_is_constexpr() { | |||||
const std::tuple<int> t1 = 1; | |||||
std::tuple<int> t2 = {std::allocator_arg, test_allocator<int>{}, t1}; | |||||
assert(std::get<0>(t2) == 1); | |||||
return true; | |||||
} | |||||
#endif | |||||
int main(int, char**) | int main(int, char**) | ||||
{ | { | ||||
{ | { | ||||
typedef std::tuple<long> T0; | typedef std::tuple<long> T0; | ||||
typedef std::tuple<long long> T1; | typedef std::tuple<long long> T1; | ||||
T0 t0(2); | T0 t0(2); | ||||
T1 t1(std::allocator_arg, A1<int>(), t0); | T1 t1(std::allocator_arg, A1<int>(), t0); | ||||
assert(std::get<0>(t1) == 2); | assert(std::get<0>(t1) == 2); | ||||
▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | int main(int, char**) | ||||
{ | { | ||||
// Test that we can use a tag derived from allocator_arg_t | // Test that we can use a tag derived from allocator_arg_t | ||||
struct DerivedFromAllocatorArgT : std::allocator_arg_t { }; | struct DerivedFromAllocatorArgT : std::allocator_arg_t { }; | ||||
DerivedFromAllocatorArgT derived; | DerivedFromAllocatorArgT derived; | ||||
std::tuple<long> from(3l); | std::tuple<long> from(3l); | ||||
std::tuple<long long> t0(derived, A1<int>(), from); | std::tuple<long long> t0(derived, A1<int>(), from); | ||||
} | } | ||||
#if _LIBCPP_STD_VER > 17 | |||||
static_assert(alloc_copy_constructor_is_constexpr()); | |||||
#endif | |||||
return 0; | return 0; | ||||
} | } |