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 // UNSUPPORTED: c++03 10 11 // This test makes sure that we can copy/move a std::tuple containing a type 12 // that checks for copy constructibility itself, like std::any. 13 // 14 // Problem showcased in https://reviews.llvm.org/D96523#2730953. 15 16 #include <any> 17 #include <tuple> 18 #include <type_traits> 19 #include <utility> 20 21 #include "test_macros.h" 22 23 template <class ...Pred> 24 struct And : std::true_type { }; 25 26 template <class P1, class ...Pn> 27 struct And<P1, Pn...> 28 : std::conditional<P1::value, And<Pn...>, std::false_type>::type 29 { }; 30 31 struct any { 32 any(); 33 any(any const&) = default; 34 35 template <class ValueType, 36 class Decayed = typename std::decay<ValueType>::type, 37 class = typename std::enable_if< 38 !std::is_same<Decayed, any>::value && 39 std::is_copy_constructible<Decayed>::value 40 >::type> 41 any(ValueType&&); 42 }; 43 44 struct A { 45 A(); 46 A(any); 47 }; 48 49 #if TEST_STD_VER > 14 50 struct B { 51 B(); 52 B(std::any); 53 }; 54 #endif 55 56 void f() { 57 { 58 std::tuple<A, int> x; 59 std::tuple<A, int> y = x; (void)y; 60 } 61 { 62 std::tuple<A, int> x; 63 std::tuple<A, int> y = std::move(x); (void)y; 64 } 65 66 #if TEST_STD_VER > 14 67 { 68 std::tuple<B, int> x; 69 std::tuple<B, int> y = x; (void)y; 70 } 71 { 72 std::tuple<B, int> x; 73 std::tuple<B, int> y = std::move(x); (void)y; 74 } 75 #endif 76 } 77