diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-07-13 19:25:57 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-07-13 19:25:57 +0000 |
commit | 289ae9e3ac13cefd468cfb852e8b9f52e984de08 (patch) | |
tree | bdee1fefb7c19e3c949b2eadeecc371c8fbce48b /test/std/utilities/optional/optional.object/special_member_gen.pass.cpp | |
parent | 9d043122e0fc90510de06d43da8eda827464c1da (diff) | |
download | src-vendor/libc++/libc++-trunk-r307894.tar.gz src-vendor/libc++/libc++-trunk-r307894.zip |
Vendor import of libc++ trunk r307894:vendor/libc++/libc++-trunk-r307894
Diffstat (limited to 'test/std/utilities/optional/optional.object/special_member_gen.pass.cpp')
-rw-r--r-- | test/std/utilities/optional/optional.object/special_member_gen.pass.cpp | 36 |
1 files changed, 32 insertions, 4 deletions
diff --git a/test/std/utilities/optional/optional.object/special_member_gen.pass.cpp b/test/std/utilities/optional/optional.object/special_member_gen.pass.cpp index fdd0f154f0e5..0b9b6e717c3a 100644 --- a/test/std/utilities/optional/optional.object/special_member_gen.pass.cpp +++ b/test/std/utilities/optional/optional.object/special_member_gen.pass.cpp @@ -33,10 +33,38 @@ struct SpecialMemberTest { "optional<T> is copy assignable if and only if T is both copy " "constructible and copy assignable."); static_assert(std::is_move_assignable_v<O> == - ((std::is_copy_constructible_v<T> && std::is_copy_assignable_v<T>) || - (std::is_move_constructible_v<T> && std::is_move_assignable_v<T>)), - "optional<T> is move assignable if and only if T is both move assignable and " - "move constructible, or both copy constructible and copy assignable."); + ((std::is_move_constructible_v<T> && std::is_move_assignable_v<T>) || + (std::is_copy_constructible_v<T> && std::is_copy_assignable_v<T>)), + "optional<T> is move assignable if and only if T is both move constructible and " + "move assignable, or both copy constructible and copy assignable."); + + // The following tests are for not-yet-standardized behavior (P0602): + static_assert(std::is_trivially_destructible_v<O> == + std::is_trivially_destructible_v<T>, + "optional<T> is trivially destructible if and only if T is."); + static_assert(std::is_trivially_copy_constructible_v<O> == + std::is_trivially_copy_constructible_v<T>, + "optional<T> is trivially copy constructible if and only if T is."); + static_assert(std::is_trivially_move_constructible_v<O> == + std::is_trivially_move_constructible_v<T> || + (!std::is_move_constructible_v<T> && std::is_trivially_copy_constructible_v<T>), + "optional<T> is trivially move constructible if T is trivially move constructible, " + "or if T is trivially copy constructible and is not move constructible."); + static_assert(std::is_trivially_copy_assignable_v<O> == + (std::is_trivially_destructible_v<T> && + std::is_trivially_copy_constructible_v<T> && + std::is_trivially_copy_assignable_v<T>), + "optional<T> is trivially copy assignable if and only if T is trivially destructible, " + "trivially copy constructible, and trivially copy assignable."); + static_assert(std::is_trivially_move_assignable_v<O> == + (std::is_trivially_destructible_v<T> && + ((std::is_trivially_move_constructible_v<T> && std::is_trivially_move_assignable_v<T>) || + ((!std::is_move_constructible_v<T> || !std::is_move_assignable_v<T>) && + std::is_trivially_copy_constructible_v<T> && std::is_trivially_copy_assignable_v<T>))), + "optional<T> is trivially move assignable if T is trivially destructible, and either " + "(1) trivially move constructible and trivially move assignable, or " + "(2) not move constructible or not move assignable, and " + "trivially copy constructible and trivially copy assignable."); }; template <class ...Args> static void sink(Args&&...) {} |