xref: /llvm-project/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/test_lazy_sfinae.pass.cpp (revision a3ab5120fd572215afeac190757834a041dda73a)
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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <tuple>
10 
11 // template <class... Types> class tuple;
12 
13 // UNSUPPORTED: c++03
14 
15 // Test the following constructors:
16 // (1) tuple(Types const&...)
17 // (2) tuple(UTypes&&...)
18 // Test that (1) short circuits before evaluating the copy constructor of the
19 // second argument. Constructor (2) should be selected.
20 
21 #include <tuple>
22 #include <utility>
23 #include <cassert>
24 
25 #include "test_macros.h"
26 
27 struct NonConstCopyable {
28   NonConstCopyable() = default;
NonConstCopyableNonConstCopyable29   explicit NonConstCopyable(int v) : value(v) {}
30   NonConstCopyable(NonConstCopyable&) = default;
31   NonConstCopyable(NonConstCopyable const&) = delete;
32   int value;
33 };
34 
35 template <class T>
36 struct BlowsUpOnConstCopy {
37   BlowsUpOnConstCopy() = default;
BlowsUpOnConstCopyBlowsUpOnConstCopy38   constexpr BlowsUpOnConstCopy(BlowsUpOnConstCopy const&) {
39       static_assert(!std::is_same<T, T>::value, "");
40   }
41   BlowsUpOnConstCopy(BlowsUpOnConstCopy&) = default;
42 };
43 
main(int,char **)44 int main(int, char**) {
45   NonConstCopyable v(42);
46   BlowsUpOnConstCopy<int> b;
47   std::tuple<NonConstCopyable, BlowsUpOnConstCopy<int>> t(v, b);
48   assert(std::get<0>(t).value == 42);
49 
50   return 0;
51 }
52