Flush out test cases for tuples constructor SFINAE
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@222278 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
af2976deb3
commit
f2215ae626
@ -33,6 +33,69 @@ struct A
|
|||||||
|
|
||||||
struct NoDefault { NoDefault() = delete; };
|
struct NoDefault { NoDefault() = delete; };
|
||||||
|
|
||||||
|
// Make sure the _Up... constructor SFINAEs out when the types that
|
||||||
|
// are not explicitly initialized are not all default constructible.
|
||||||
|
// Otherwise, std::is_constructible would return true but instantiating
|
||||||
|
// the constructor would fail.
|
||||||
|
void test_default_constructible_extension_sfinae()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
typedef std::tuple<MoveOnly, NoDefault> Tuple;
|
||||||
|
|
||||||
|
static_assert(!std::is_constructible<
|
||||||
|
Tuple,
|
||||||
|
MoveOnly
|
||||||
|
>::value, "");
|
||||||
|
|
||||||
|
static_assert(std::is_constructible<
|
||||||
|
Tuple,
|
||||||
|
MoveOnly, NoDefault
|
||||||
|
>::value, "");
|
||||||
|
}
|
||||||
|
{
|
||||||
|
typedef std::tuple<MoveOnly, MoveOnly, NoDefault> Tuple;
|
||||||
|
|
||||||
|
static_assert(!std::is_constructible<
|
||||||
|
Tuple,
|
||||||
|
MoveOnly, MoveOnly
|
||||||
|
>::value, "");
|
||||||
|
|
||||||
|
static_assert(std::is_constructible<
|
||||||
|
Tuple,
|
||||||
|
MoveOnly, MoveOnly, NoDefault
|
||||||
|
>::value, "");
|
||||||
|
}
|
||||||
|
{
|
||||||
|
// Same idea as above but with a nested tuple type.
|
||||||
|
typedef std::tuple<MoveOnly, NoDefault> Tuple;
|
||||||
|
typedef std::tuple<MoveOnly, Tuple, MoveOnly, MoveOnly> NestedTuple;
|
||||||
|
|
||||||
|
static_assert(!std::is_constructible<
|
||||||
|
NestedTuple,
|
||||||
|
MoveOnly, MoveOnly, MoveOnly, MoveOnly
|
||||||
|
>::value, "");
|
||||||
|
|
||||||
|
static_assert(std::is_constructible<
|
||||||
|
NestedTuple,
|
||||||
|
MoveOnly, Tuple, MoveOnly, MoveOnly
|
||||||
|
>::value, "");
|
||||||
|
}
|
||||||
|
{
|
||||||
|
typedef std::tuple<MoveOnly, int> Tuple;
|
||||||
|
typedef std::tuple<MoveOnly, Tuple, MoveOnly, MoveOnly> NestedTuple;
|
||||||
|
|
||||||
|
static_assert(std::is_constructible<
|
||||||
|
NestedTuple,
|
||||||
|
MoveOnly, MoveOnly, MoveOnly, MoveOnly
|
||||||
|
>::value, "");
|
||||||
|
|
||||||
|
static_assert(std::is_constructible<
|
||||||
|
NestedTuple,
|
||||||
|
MoveOnly, Tuple, MoveOnly, MoveOnly
|
||||||
|
>::value, "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -66,14 +129,6 @@ int main()
|
|||||||
assert(std::get<1>(t) == MoveOnly());
|
assert(std::get<1>(t) == MoveOnly());
|
||||||
assert(std::get<2>(t) == MoveOnly());
|
assert(std::get<2>(t) == MoveOnly());
|
||||||
}
|
}
|
||||||
{
|
|
||||||
// Make sure the _Up... constructor SFINAEs out when the types that
|
|
||||||
// are not explicitly initialized are not all default constructible.
|
|
||||||
// Otherwise, std::is_constructible would return true but instantiating
|
|
||||||
// the constructor would fail.
|
|
||||||
static_assert(!std::is_constructible<std::tuple<MoveOnly, NoDefault>, MoveOnly>(), "");
|
|
||||||
static_assert(!std::is_constructible<std::tuple<MoveOnly, MoveOnly, NoDefault>, MoveOnly, MoveOnly>(), "");
|
|
||||||
}
|
|
||||||
#if _LIBCPP_STD_VER > 11
|
#if _LIBCPP_STD_VER > 11
|
||||||
{
|
{
|
||||||
constexpr std::tuple<Empty> t0{Empty()};
|
constexpr std::tuple<Empty> t0{Empty()};
|
||||||
@ -83,4 +138,7 @@ int main()
|
|||||||
static_assert(std::get<0>(t).id_ == 3, "");
|
static_assert(std::get<0>(t).id_ == 3, "");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
// Check that SFINAE is properly applied with the default reduced arity
|
||||||
|
// constructor extensions.
|
||||||
|
test_default_constructible_extension_sfinae();
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,69 @@
|
|||||||
|
|
||||||
struct NoDefault { NoDefault() = delete; };
|
struct NoDefault { NoDefault() = delete; };
|
||||||
|
|
||||||
|
// Make sure the _Up... constructor SFINAEs out when the types that
|
||||||
|
// are not explicitly initialized are not all default constructible.
|
||||||
|
// Otherwise, std::is_constructible would return true but instantiating
|
||||||
|
// the constructor would fail.
|
||||||
|
void test_default_constructible_extension_sfinae()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
typedef std::tuple<MoveOnly, NoDefault> Tuple;
|
||||||
|
|
||||||
|
static_assert(!std::is_constructible<
|
||||||
|
Tuple,
|
||||||
|
std::allocator_arg_t, A1<int>, MoveOnly
|
||||||
|
>::value, "");
|
||||||
|
|
||||||
|
static_assert(std::is_constructible<
|
||||||
|
Tuple,
|
||||||
|
std::allocator_arg_t, A1<int>, MoveOnly, NoDefault
|
||||||
|
>::value, "");
|
||||||
|
}
|
||||||
|
{
|
||||||
|
typedef std::tuple<MoveOnly, MoveOnly, NoDefault> Tuple;
|
||||||
|
|
||||||
|
static_assert(!std::is_constructible<
|
||||||
|
std::tuple<MoveOnly, MoveOnly, NoDefault>,
|
||||||
|
std::allocator_arg_t, A1<int>, MoveOnly, MoveOnly
|
||||||
|
>::value, "");
|
||||||
|
|
||||||
|
static_assert(std::is_constructible<
|
||||||
|
std::tuple<MoveOnly, MoveOnly, NoDefault>,
|
||||||
|
std::allocator_arg_t, A1<int>, MoveOnly, MoveOnly, NoDefault
|
||||||
|
>::value, "");
|
||||||
|
}
|
||||||
|
{
|
||||||
|
// Same idea as above but with a nested tuple
|
||||||
|
typedef std::tuple<MoveOnly, NoDefault> Tuple;
|
||||||
|
typedef std::tuple<MoveOnly, Tuple, MoveOnly, MoveOnly> NestedTuple;
|
||||||
|
|
||||||
|
static_assert(!std::is_constructible<
|
||||||
|
NestedTuple,
|
||||||
|
std::allocator_arg_t, A1<int>, MoveOnly, MoveOnly, MoveOnly, MoveOnly
|
||||||
|
>::value, "");
|
||||||
|
|
||||||
|
static_assert(std::is_constructible<
|
||||||
|
NestedTuple,
|
||||||
|
std::allocator_arg_t, A1<int>, MoveOnly, Tuple, MoveOnly, MoveOnly
|
||||||
|
>::value, "");
|
||||||
|
}
|
||||||
|
{
|
||||||
|
typedef std::tuple<MoveOnly, int> Tuple;
|
||||||
|
typedef std::tuple<MoveOnly, Tuple, MoveOnly, MoveOnly> NestedTuple;
|
||||||
|
|
||||||
|
static_assert(std::is_constructible<
|
||||||
|
NestedTuple,
|
||||||
|
std::allocator_arg_t, A1<int>, MoveOnly, MoveOnly, MoveOnly, MoveOnly
|
||||||
|
>::value, "");
|
||||||
|
|
||||||
|
static_assert(std::is_constructible<
|
||||||
|
NestedTuple,
|
||||||
|
std::allocator_arg_t, A1<int>, MoveOnly, Tuple, MoveOnly, MoveOnly
|
||||||
|
>::value, "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -70,19 +133,7 @@ int main()
|
|||||||
assert(std::get<1>(t) == MoveOnly());
|
assert(std::get<1>(t) == MoveOnly());
|
||||||
assert(std::get<2>(t) == MoveOnly());
|
assert(std::get<2>(t) == MoveOnly());
|
||||||
}
|
}
|
||||||
{
|
// Check that SFINAE is properly applied with the default reduced arity
|
||||||
// Make sure the _Up... constructor SFINAEs out when the types that
|
// constructor extensions.
|
||||||
// are not explicitly initialized are not all default constructible.
|
test_default_constructible_extension_sfinae();
|
||||||
// Otherwise, std::is_constructible would return true but instantiating
|
|
||||||
// the constructor would fail.
|
|
||||||
static_assert(!std::is_constructible<
|
|
||||||
std::tuple<MoveOnly, NoDefault>,
|
|
||||||
std::allocator_arg_t, A1<int>, MoveOnly
|
|
||||||
>::value, "");
|
|
||||||
|
|
||||||
static_assert(!std::is_constructible<
|
|
||||||
std::tuple<MoveOnly, MoveOnly, NoDefault>,
|
|
||||||
std::allocator_arg_t, A1<int>, MoveOnly, MoveOnly
|
|
||||||
>::value, "");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user