diff options
Diffstat (limited to 'libcxx/test')
| -rw-r--r-- | libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/move.pass.cpp | 50 | 
1 files changed, 50 insertions, 0 deletions
diff --git a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/move.pass.cpp b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/move.pass.cpp index 1bd7d6d4e8a..0c93673532b 100644 --- a/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/move.pass.cpp +++ b/libcxx/test/std/utilities/tuple/tuple.tuple/tuple.cnstr/move.pass.cpp @@ -35,6 +35,52 @@ struct ConstructsWithTupleLeaf      }  }; +// move_only type which triggers the empty base optimization +struct move_only_ebo { +  move_only_ebo() = default; +  move_only_ebo(move_only_ebo&&) = default; +}; + +// a move_only type which does not trigger the empty base optimization +struct move_only_large final { +  move_only_large() : value(42) {} +  move_only_large(move_only_large&&) = default; +  int value; +}; + +template <class Elem> +void test_sfinae() { +    using Tup = std::tuple<Elem>; +    using Alloc = std::allocator<void>; +    using Tag = std::allocator_arg_t; +    // special members +    { +        static_assert(std::is_default_constructible<Tup>::value, ""); +        static_assert(std::is_move_constructible<Tup>::value, ""); +        static_assert(!std::is_copy_constructible<Tup>::value, ""); +        static_assert(!std::is_constructible<Tup, Tup&>::value, ""); +    } +    // args constructors +    { +        static_assert(std::is_constructible<Tup, Elem&&>::value, ""); +        static_assert(!std::is_constructible<Tup, Elem const&>::value, ""); +        static_assert(!std::is_constructible<Tup, Elem&>::value, ""); +    } +    // uses-allocator special member constructors +    { +        static_assert(std::is_constructible<Tup, Tag, Alloc>::value, ""); +        static_assert(std::is_constructible<Tup, Tag, Alloc, Tup&&>::value, ""); +        static_assert(!std::is_constructible<Tup, Tag, Alloc, Tup const&>::value, ""); +        static_assert(!std::is_constructible<Tup, Tag, Alloc, Tup &>::value, ""); +    } +    // uses-allocator args constructors +    { +        static_assert(std::is_constructible<Tup, Tag, Alloc, Elem&&>::value, ""); +        static_assert(!std::is_constructible<Tup, Tag, Alloc, Elem const&>::value, ""); +        static_assert(!std::is_constructible<Tup, Tag, Alloc, Elem &>::value, ""); +    } +} +  int main()  {      { @@ -72,4 +118,8 @@ int main()          d_t d((ConstructsWithTupleLeaf()));          d_t d2(static_cast<d_t &&>(d));      } +    { +        test_sfinae<move_only_ebo>(); +        test_sfinae<move_only_large>(); +    }  }  | 

