| // { dg-do compile { target c++11 } } |
| // { dg-options "-Wno-unused-variable" } |
| // { dg-additional-options "-D_GLIBCXX_DEBUG" { target c++17_down } } |
| // { dg-skip-if "cannot mix with DEBUG" { *-*-* } { "-D_GLIBCXX_PARALLEL" } } |
| #include <tuple> |
| #include <utility> |
| |
| #if __cplusplus >= 202002L |
| // For C++20 and later, constructors are constrained to disallow dangling. |
| static_assert(!std::is_constructible_v<std::tuple<const int&>, long>); |
| static_assert(!std::is_constructible_v<std::tuple<const int&, int>, long, int>); |
| static_assert(!std::is_constructible_v<std::tuple<int, const int&>, int, long>); |
| static_assert(!std::is_constructible_v<std::tuple<const int&, int>, |
| std::tuple<long, long>>); |
| static_assert(!std::is_constructible_v<std::tuple<int, const int&>, |
| std::tuple<long, long>>); |
| static_assert(!std::is_constructible_v<std::tuple<const int&, int>, |
| const std::tuple<long, long>&>); |
| static_assert(!std::is_constructible_v<std::tuple<int, const int&>, |
| const std::tuple<long, long>&>); |
| static_assert(!std::is_constructible_v<std::tuple<const int&, int>, |
| std::pair<long, long>>); |
| static_assert(!std::is_constructible_v<std::tuple<int, const int&>, |
| std::pair<long, long>>); |
| static_assert(!std::is_constructible_v<std::tuple<const int&, int>, |
| const std::pair<long, long>&>); |
| static_assert(!std::is_constructible_v<std::tuple<int, const int&>, |
| const std::pair<long, long>&>); |
| #endif |
| |
| void |
| test_ary_ctors() |
| { |
| std::tuple<const int&> t1(1L); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 34 } |
| // { dg-error "use of deleted function" "" { target c++20 } 34 } |
| |
| std::tuple<const int&, int> t2(1L, 2); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 38 } |
| // { dg-error "use of deleted function" "" { target c++20 } 38 } |
| |
| std::tuple<int, const int&> t3(1, 2L); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 42 } |
| // { dg-error "use of deleted function" "" { target c++20 } 42 } |
| |
| std::tuple<const int&, const int&> t4(1L, 2L); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 46 } |
| // { dg-error "use of deleted function" "" { target c++20 } 46 } |
| |
| std::tuple<const int&, const int&> t5(std::pair<long, int>{}); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 50 } |
| // { dg-error "use of deleted function" "" { target c++20 } 50 } |
| |
| std::pair<int, long> p; |
| std::tuple<const int&, const int&> t6(p); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 55 } |
| // { dg-error "use of deleted function" "" { target c++20 } 55 } |
| |
| std::tuple<const int&, int, int> t7(1L, 2, 3); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 59 } |
| // { dg-error "use of deleted function" "" { target c++20 } 59 } |
| } |
| |
| void |
| test_converting_ctors() |
| { |
| std::tuple<long> t10; |
| |
| std::tuple<const int&> t11(t10); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 69 } |
| // { dg-error "use of deleted function" "" { target c++20 } 69 } |
| |
| std::tuple<const int&> t12(std::move(t10)); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 73 } |
| // { dg-error "use of deleted function" "" { target c++20 } 73 } |
| |
| std::tuple<long, long> t20; |
| |
| std::tuple<const int&, int> t21(t20); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 79 } |
| // { dg-error "use of deleted function" "" { target c++20 } 79 } |
| |
| std::tuple<int, const int&> t22(t20); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 83 } |
| // { dg-error "use of deleted function" "" { target c++20 } 83 } |
| |
| std::tuple<const int&, const int&> t23(t20); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 87 } |
| // { dg-error "use of deleted function" "" { target c++20 } 87 } |
| |
| std::tuple<const int&, int> t24(std::move(t20)); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 91 } |
| // { dg-error "use of deleted function" "" { target c++20 } 91 } |
| |
| std::tuple<int, const int&> t25(std::move(t20)); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 95 } |
| // { dg-error "use of deleted function" "" { target c++20 } 95 } |
| |
| std::tuple<const int&, const int&> t26(std::move(t20)); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 99 } |
| // { dg-error "use of deleted function" "" { target c++20 } 99 } |
| |
| std::pair<long, long> p0; |
| std::tuple<const int&, int> t27(p0); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 104 } |
| // { dg-error "use of deleted function" "" { target c++20 } 104 } |
| |
| std::tuple<int, const int&> t28(p0); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 108 } |
| // { dg-error "use of deleted function" "" { target c++20 } 108 } |
| |
| std::tuple<const int&, int> t29(std::move(p0)); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 112 } |
| // { dg-error "use of deleted function" "" { target c++20 } 112 } |
| |
| std::tuple<int, const int&> t210(std::move(p0)); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 116 } |
| // { dg-error "use of deleted function" "" { target c++20 } 116 } |
| } |
| |
| #include <memory> |
| |
| void |
| test_allocator_extended_ctors() |
| { |
| std::allocator<int> a; |
| |
| std::tuple<const int&> t1(std::allocator_arg, a, 1L); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 128 } |
| // { dg-error "use of deleted function" "" { target c++20 } 128 } |
| |
| std::tuple<const int&, int> t2(std::allocator_arg, a, 1L, 2); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 132 } |
| // { dg-error "use of deleted function" "" { target c++20 } 132 } |
| |
| std::tuple<long> tl; |
| |
| std::tuple<const int&> t3(std::allocator_arg, a, tl); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 138 } |
| // { dg-error "use of deleted function" "" { target c++20 } 138 } |
| |
| std::tuple<const int&> t4(std::allocator_arg, a, std::move(tl)); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 142 } |
| // { dg-error "use of deleted function" "" { target c++20 } 142 } |
| |
| std::tuple<long, long> tll; |
| |
| std::tuple<const int&, int> t5(std::allocator_arg, a, tll); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 148 } |
| // { dg-error "use of deleted function" "" { target c++20 } 148 } |
| |
| std::tuple<const int&, int> t6(std::allocator_arg, a, std::move(tll)); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 152 } |
| // { dg-error "use of deleted function" "" { target c++20 } 152 } |
| |
| std::pair<long, long> pll; |
| |
| std::tuple<const int&, int> t7(std::allocator_arg, a, pll); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 158 } |
| // { dg-error "use of deleted function" "" { target c++20 } 158 } |
| |
| std::tuple<const int&, int> t8(std::allocator_arg, a, std::move(pll)); |
| // { dg-error "here" "" { target { c++17_down && hosted } } 162 } |
| // { dg-error "use of deleted function" "" { target c++20 } 162 } |
| } |
| |
| // { dg-error "static assert.* dangling reference" "" { target { c++17_down && hosted } } 0 } |