Home | History | Annotate | Download | only in tuple.cnstr
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // <tuple>
     11 
     12 // template <class... Types> class tuple;
     13 
     14 // template <class... UTypes> tuple(const tuple<UTypes...>& u);
     15 
     16 // UNSUPPORTED: c++98, c++03
     17 
     18 #include <tuple>
     19 #include <utility>
     20 #include <string>
     21 #include <cassert>
     22 
     23 struct B
     24 {
     25     int id_;
     26 
     27     explicit B(int i) : id_(i) {}
     28 };
     29 
     30 struct D
     31     : B
     32 {
     33     explicit D(int i) : B(i) {}
     34 };
     35 
     36 #if _LIBCPP_STD_VER > 11
     37 
     38 struct A
     39 {
     40     int id_;
     41 
     42     constexpr A(int i) : id_(i) {}
     43     friend constexpr bool operator==(const A& x, const A& y) {return x.id_ == y.id_;}
     44 };
     45 
     46 struct C
     47 {
     48     int id_;
     49 
     50     constexpr explicit C(int i) : id_(i) {}
     51     friend constexpr bool operator==(const C& x, const C& y) {return x.id_ == y.id_;}
     52 };
     53 
     54 #endif
     55 
     56 int main()
     57 {
     58     {
     59         typedef std::tuple<double> T0;
     60         typedef std::tuple<int> T1;
     61         T0 t0(2.5);
     62         T1 t1 = t0;
     63         assert(std::get<0>(t1) == 2);
     64     }
     65 #if _LIBCPP_STD_VER > 11
     66     {
     67         typedef std::tuple<double> T0;
     68         typedef std::tuple<A> T1;
     69         constexpr T0 t0(2.5);
     70         constexpr T1 t1 = t0;
     71         static_assert(std::get<0>(t1) == 2, "");
     72     }
     73     {
     74         typedef std::tuple<int> T0;
     75         typedef std::tuple<C> T1;
     76         constexpr T0 t0(2);
     77         constexpr T1 t1{t0};
     78         static_assert(std::get<0>(t1) == C(2), "");
     79     }
     80 #endif
     81     {
     82         typedef std::tuple<double, char> T0;
     83         typedef std::tuple<int, int> T1;
     84         T0 t0(2.5, 'a');
     85         T1 t1 = t0;
     86         assert(std::get<0>(t1) == 2);
     87         assert(std::get<1>(t1) == int('a'));
     88     }
     89     {
     90         typedef std::tuple<double, char, D> T0;
     91         typedef std::tuple<int, int, B> T1;
     92         T0 t0(2.5, 'a', D(3));
     93         T1 t1 = t0;
     94         assert(std::get<0>(t1) == 2);
     95         assert(std::get<1>(t1) == int('a'));
     96         assert(std::get<2>(t1).id_ == 3);
     97     }
     98     {
     99         D d(3);
    100         typedef std::tuple<double, char, D&> T0;
    101         typedef std::tuple<int, int, B&> T1;
    102         T0 t0(2.5, 'a', d);
    103         T1 t1 = t0;
    104         d.id_ = 2;
    105         assert(std::get<0>(t1) == 2);
    106         assert(std::get<1>(t1) == int('a'));
    107         assert(std::get<2>(t1).id_ == 2);
    108     }
    109     {
    110         typedef std::tuple<double, char, int> T0;
    111         typedef std::tuple<int, int, B> T1;
    112         T0 t0(2.5, 'a', 3);
    113         T1 t1(t0);
    114         assert(std::get<0>(t1) == 2);
    115         assert(std::get<1>(t1) == int('a'));
    116         assert(std::get<2>(t1).id_ == 3);
    117     }
    118 }
    119