brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · 40b5cda Raw
114 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <tuple>10 11// template <class... Types> class tuple;12 13// template <class Alloc, class... UTypes>14// constexpr                                        // since c++2015//   tuple(allocator_arg_t, const Alloc& a, const tuple<UTypes...>&);16 17// UNSUPPORTED: c++0318 19#include <tuple>20#include <memory>21#include <cassert>22 23#include "test_macros.h"24#include "allocators.h"25#include "test_allocator.h"26#include "../alloc_first.h"27#include "../alloc_last.h"28 29struct Explicit {30  int value;31  explicit Explicit(int x) : value(x) {}32};33 34struct Implicit {35  int value;36  Implicit(int x) : value(x) {}37};38 39#if TEST_STD_VER > 1740constexpr bool alloc_copy_constructor_is_constexpr() {41  const std::tuple<int> t1 = 1;42  std::tuple<int> t2 = {std::allocator_arg, test_allocator<int>{}, t1};43  assert(std::get<0>(t2) == 1);44  return true;45}46#endif47 48int main(int, char**)49{50    {51        typedef std::tuple<long> T0;52        typedef std::tuple<long long> T1;53        T0 t0(2);54        T1 t1(std::allocator_arg, A1<int>(), t0);55        assert(std::get<0>(t1) == 2);56    }57    {58        typedef std::tuple<int> T0;59        typedef std::tuple<alloc_first> T1;60        T0 t0(2);61        alloc_first::allocator_constructed = false;62        T1 t1(std::allocator_arg, A1<int>(5), t0);63        assert(alloc_first::allocator_constructed);64        assert(std::get<0>(t1) == 2);65    }66    {67        typedef std::tuple<int, int> T0;68        typedef std::tuple<alloc_first, alloc_last> T1;69        T0 t0(2, 3);70        alloc_first::allocator_constructed = false;71        alloc_last::allocator_constructed = false;72        T1 t1(std::allocator_arg, A1<int>(5), t0);73        assert(alloc_first::allocator_constructed);74        assert(alloc_last::allocator_constructed);75        assert(std::get<0>(t1) == 2);76        assert(std::get<1>(t1) == 3);77    }78    {79        typedef std::tuple<long, int, int> T0;80        typedef std::tuple<long long, alloc_first, alloc_last> T1;81        T0 t0(1, 2, 3);82        alloc_first::allocator_constructed = false;83        alloc_last::allocator_constructed = false;84        T1 t1(std::allocator_arg, A1<int>(5), t0);85        assert(alloc_first::allocator_constructed);86        assert(alloc_last::allocator_constructed);87        assert(std::get<0>(t1) == 1);88        assert(std::get<1>(t1) == 2);89        assert(std::get<2>(t1) == 3);90    }91    {92        const std::tuple<int> t1(42);93        std::tuple<Explicit> t2{std::allocator_arg, std::allocator<int>{},  t1};94        assert(std::get<0>(t2).value == 42);95    }96    {97        const std::tuple<int> t1(42);98        std::tuple<Implicit> t2 = {std::allocator_arg, std::allocator<int>{}, t1};99        assert(std::get<0>(t2).value == 42);100    }101    {102        // Test that we can use a tag derived from allocator_arg_t103        struct DerivedFromAllocatorArgT : std::allocator_arg_t { };104        DerivedFromAllocatorArgT derived;105        std::tuple<long> from(3l);106        std::tuple<long long> t0(derived, A1<int>(), from);107    }108 109#if TEST_STD_VER > 17110    static_assert(alloc_copy_constructor_is_constexpr());111#endif112    return 0;113}114