Flush out test cases for tuples constructor SFINAE

llvm-svn: 222278
This commit is contained in:
Eric Fiselier 2014-11-18 23:01:57 +00:00
parent 34042212b2
commit a4884fdefd
2 changed files with 132 additions and 23 deletions

View File

@ -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();
}

View File

@ -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();
}