forked from OSchip/llvm-project
Flush out test cases for tuples constructor SFINAE
llvm-svn: 222278
This commit is contained in:
parent
34042212b2
commit
a4884fdefd
|
@ -33,6 +33,69 @@ struct A
|
|||
|
||||
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()
|
||||
{
|
||||
{
|
||||
|
@ -66,14 +129,6 @@ int main()
|
|||
assert(std::get<1>(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
|
||||
{
|
||||
constexpr std::tuple<Empty> t0{Empty()};
|
||||
|
@ -83,4 +138,7 @@ int main()
|
|||
static_assert(std::get<0>(t).id_ == 3, "");
|
||||
}
|
||||
#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; };
|
||||
|
||||
// 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()
|
||||
{
|
||||
{
|
||||
|
@ -70,19 +133,7 @@ int main()
|
|||
assert(std::get<1>(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>,
|
||||
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, "");
|
||||
}
|
||||
// Check that SFINAE is properly applied with the default reduced arity
|
||||
// constructor extensions.
|
||||
test_default_constructible_extension_sfinae();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue