blob: e7271a58a2f12b49e9a699be4d80e653e79c318a [file] [log] [blame]
// { 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 }