diff --git a/test/std/utilities/utility/pairs/pairs.pair/U_V.pass.cpp b/test/std/utilities/utility/pairs/pairs.pair/U_V.pass.cpp index 0598c2da5..1ef2d9402 100644 --- a/test/std/utilities/utility/pairs/pairs.pair/U_V.pass.cpp +++ b/test/std/utilities/utility/pairs/pairs.pair/U_V.pass.cpp @@ -22,6 +22,7 @@ #include "archetypes.hpp" #include "test_convertible.hpp" +using namespace ImplicitTypes; // Get implicitly archetypes template @@ -58,20 +59,20 @@ int main() // Test non-const lvalue and rvalue types test_sfinae(); test_sfinae(); - test_sfinae(); - test_sfinae(); + test_sfinae(); + test_sfinae(); test_sfinae(); test_sfinae(); - test_sfinae(); - test_sfinae(); + test_sfinae(); + test_sfinae(); test_sfinae(); test_sfinae(); - test_sfinae(); - test_sfinae(); + test_sfinae(); + test_sfinae(); test_sfinae(); test_sfinae(); - test_sfinae(); - test_sfinae(); + test_sfinae(); + test_sfinae(); } { // Test converting types @@ -79,10 +80,10 @@ int main() test_sfinae(); test_sfinae(); test_sfinae(); - test_sfinae(); - test_sfinae(); - test_sfinae(); - test_sfinae(); + test_sfinae(); + test_sfinae(); + test_sfinae(); + test_sfinae(); } #if TEST_STD_VER > 11 { // explicit constexpr test diff --git a/test/std/utilities/utility/pairs/pairs.pair/const_first_const_second.pass.cpp b/test/std/utilities/utility/pairs/pairs.pair/const_first_const_second.pass.cpp index e3b780a0e..bf19d1abe 100644 --- a/test/std/utilities/utility/pairs/pairs.pair/const_first_const_second.pass.cpp +++ b/test/std/utilities/utility/pairs/pairs.pair/const_first_const_second.pass.cpp @@ -20,6 +20,7 @@ #include "archetypes.hpp" #include "test_convertible.hpp" +using namespace ImplicitTypes; // Get implicitly archetypes struct ExplicitT { constexpr explicit ExplicitT(int x) : value(x) {} @@ -62,13 +63,13 @@ int main() } { test_sfinae(); - test_sfinae(); + test_sfinae(); test_sfinae(); - test_sfinae(); + test_sfinae(); test_sfinae(); - test_sfinae(); + test_sfinae(); test_sfinae(); - test_sfinae(); + test_sfinae(); } #if TEST_STD_VER > 11 { diff --git a/test/std/utilities/utility/pairs/pairs.pair/const_pair_U_V.pass.cpp b/test/std/utilities/utility/pairs/pairs.pair/const_pair_U_V.pass.cpp index ce9c2ccd4..ade8130d7 100644 --- a/test/std/utilities/utility/pairs/pairs.pair/const_pair_U_V.pass.cpp +++ b/test/std/utilities/utility/pairs/pairs.pair/const_pair_U_V.pass.cpp @@ -20,6 +20,7 @@ #include "archetypes.hpp" #include "test_convertible.hpp" +using namespace ImplicitTypes; // Get implicitly archetypes template @@ -79,27 +80,27 @@ int main() test_pair_const(); test_pair_const(); - test_pair_const(); // copy construction - test_pair_const(); - test_pair_const(); - test_pair_const(); - test_pair_const(); + test_pair_const(); // copy construction + test_pair_const(); + test_pair_const(); + test_pair_const(); + test_pair_const(); test_pair_const(); // copy construction test_pair_const(); test_pair_const(); - test_pair_const(); // copy construction - test_pair_const(); - test_pair_const(); + test_pair_const(); // copy construction + test_pair_const(); + test_pair_const(); test_pair_const(); test_pair_const(); test_pair_const(); - test_pair_const(); - test_pair_const(); - test_pair_const(); + test_pair_const(); + test_pair_const(); + test_pair_const(); test_pair_const(); test_pair_const(); @@ -116,23 +117,23 @@ int main() test_pair_const(); test_pair_const(); - test_pair_const(); + test_pair_const(); // Unfortunately the below conversions are allowed and create dangling // references. //test_pair_const(); //test_pair_const(); //test_pair_const(); // But these are not because the converting constructor is explicit. - test_pair_const(); - test_pair_const(); - test_pair_const(); + test_pair_const(); + test_pair_const(); + test_pair_const(); } { test_pair_const(); - test_pair_const(); + test_pair_const(); test_pair_const(); - test_pair_const(); + test_pair_const(); test_pair_const(); test_pair_const(); @@ -140,16 +141,16 @@ int main() test_pair_const(); test_pair_const(); - test_pair_const(); - test_pair_const(); - test_pair_const(); - test_pair_const(); - test_pair_const(); + test_pair_const(); + test_pair_const(); + test_pair_const(); + test_pair_const(); + test_pair_const(); - test_pair_const(); - test_pair_const(); - test_pair_const(); - test_pair_const(); + test_pair_const(); + test_pair_const(); + test_pair_const(); + test_pair_const(); } #if TEST_STD_VER > 11 { diff --git a/test/std/utilities/utility/pairs/pairs.pair/default.pass.cpp b/test/std/utilities/utility/pairs/pairs.pair/default.pass.cpp index e69654125..91af37569 100644 --- a/test/std/utilities/utility/pairs/pairs.pair/default.pass.cpp +++ b/test/std/utilities/utility/pairs/pairs.pair/default.pass.cpp @@ -28,6 +28,7 @@ #include "test_macros.h" #include "archetypes.hpp" +using namespace ImplicitTypes; // Get implicitly archetypes int main() { diff --git a/test/std/utilities/utility/pairs/pairs.pair/rv_pair_U_V.pass.cpp b/test/std/utilities/utility/pairs/pairs.pair/rv_pair_U_V.pass.cpp index f10fae4f9..285619084 100644 --- a/test/std/utilities/utility/pairs/pairs.pair/rv_pair_U_V.pass.cpp +++ b/test/std/utilities/utility/pairs/pairs.pair/rv_pair_U_V.pass.cpp @@ -21,6 +21,7 @@ #include "archetypes.hpp" #include "test_convertible.hpp" +using namespace ImplicitTypes; // Get implicitly archetypes template @@ -89,27 +90,27 @@ int main() test_pair_rv(); test_pair_rv(); - test_pair_rv(); - test_pair_rv(); - test_pair_rv(); - test_pair_rv(); - test_pair_rv(); + test_pair_rv(); + test_pair_rv(); + test_pair_rv(); + test_pair_rv(); + test_pair_rv(); test_pair_rv(); test_pair_rv(); test_pair_rv(); - test_pair_rv(); // copy construction - test_pair_rv(); - test_pair_rv(); + test_pair_rv(); // copy construction + test_pair_rv(); + test_pair_rv(); test_pair_rv(); test_pair_rv(); test_pair_rv(); - test_pair_rv(); - test_pair_rv(); - test_pair_rv(); + test_pair_rv(); + test_pair_rv(); + test_pair_rv(); test_pair_rv(); test_pair_rv(); @@ -125,22 +126,22 @@ int main() test_pair_rv(); test_pair_rv(); - test_pair_rv(); + test_pair_rv(); // Unfortunately the below conversions are allowed and create dangling // references. //test_pair_rv(); //test_pair_rv(); //test_pair_rv(); // But these are not because the converting constructor is explicit. - test_pair_rv(); - test_pair_rv(); - test_pair_rv(); + test_pair_rv(); + test_pair_rv(); + test_pair_rv(); } { test_pair_rv(); - test_pair_rv(); + test_pair_rv(); test_pair_rv(); - test_pair_rv(); + test_pair_rv(); test_pair_rv(); test_pair_rv(); @@ -148,16 +149,16 @@ int main() test_pair_rv(); test_pair_rv(); - test_pair_rv(); - test_pair_rv(); - test_pair_rv(); - test_pair_rv(); - test_pair_rv(); + test_pair_rv(); + test_pair_rv(); + test_pair_rv(); + test_pair_rv(); + test_pair_rv(); - test_pair_rv(); - test_pair_rv(); - test_pair_rv(); - test_pair_rv(); + test_pair_rv(); + test_pair_rv(); + test_pair_rv(); + test_pair_rv(); } #if TEST_STD_VER > 11 { // explicit constexpr test diff --git a/test/std/utilities/utility/pairs/pairs.pair/special_member_generation_test.pass.cpp b/test/std/utilities/utility/pairs/pairs.pair/special_member_generation_test.pass.cpp index c906f61f7..1331a3153 100644 --- a/test/std/utilities/utility/pairs/pairs.pair/special_member_generation_test.pass.cpp +++ b/test/std/utilities/utility/pairs/pairs.pair/special_member_generation_test.pass.cpp @@ -26,6 +26,7 @@ #include #include "archetypes.hpp" +using namespace ImplicitTypes; // Get implicitly archetypes namespace ConstructorTest { diff --git a/test/support/archetypes.hpp b/test/support/archetypes.hpp index d5b6bcbf4..5b2940496 100644 --- a/test/support/archetypes.hpp +++ b/test/support/archetypes.hpp @@ -5,105 +5,32 @@ #if TEST_STD_VER >= 11 -struct NoDefault { - NoDefault() = delete; -}; +//============================================================================// +// Trivial Implicit Test Types +namespace ImplicitTypes { +#include "archetypes.ipp" +} -// Implicit copy/move types +//============================================================================// +// Trivial Explicit Test Types +namespace ExplicitTypes { +#define DEFINE_EXPLICIT explicit +#include "archetypes.ipp" +} -struct AllCtors { - AllCtors() = default; - AllCtors(AllCtors const&) = default; - AllCtors(AllCtors &&) = default; - AllCtors& operator=(AllCtors const&) = default; - AllCtors& operator=(AllCtors &&) = default; -}; +//============================================================================// +// Non-Trivial Implicit Test Types +namespace NonLiteralTypes { +#define DEFINE_DTOR(Name) ~Name() {} +#include "archetypes.ipp" +} -struct Copyable { - Copyable() = default; - Copyable(Copyable const &) = default; - Copyable &operator=(Copyable const &) = default; -}; - -struct CopyOnly { - CopyOnly() = default; - CopyOnly(CopyOnly const &) = default; - CopyOnly &operator=(CopyOnly const &) = default; - CopyOnly(CopyOnly &&) = delete; - CopyOnly &operator=(CopyOnly &&) = delete; -}; - -struct NonCopyable { - NonCopyable() = default; - NonCopyable(NonCopyable const &) = delete; - NonCopyable &operator=(NonCopyable const &) = delete; -}; - -struct MoveOnly { - MoveOnly() = default; - MoveOnly(MoveOnly &&) = default; - MoveOnly &operator=(MoveOnly &&) = default; -}; - -struct ConvertingType { - ConvertingType() = default; - ConvertingType(ConvertingType const&) = default; - ConvertingType(ConvertingType &&) = default; - ConvertingType& operator=(ConvertingType const&) = default; - ConvertingType& operator=(ConvertingType &&) = default; - template - ConvertingType(Args&&...) {} - template - ConvertingType& operator=(Arg&&) { return *this; } -}; - -struct ExplicitConvertingType { - ExplicitConvertingType() = default; - explicit ExplicitConvertingType(ExplicitConvertingType const&) = default; - explicit ExplicitConvertingType(ExplicitConvertingType &&) = default; - ExplicitConvertingType& operator=(ExplicitConvertingType const&) = default; - ExplicitConvertingType& operator=(ExplicitConvertingType &&) = default; - template - explicit ExplicitConvertingType(Args&&...) {} - template - ExplicitConvertingType& operator=(Arg&&) { return *this; } -}; - -// Explicit copy/move types - -struct ExplicitAllCtors { - explicit ExplicitAllCtors() = default; - explicit ExplicitAllCtors(ExplicitAllCtors const&) = default; - explicit ExplicitAllCtors(ExplicitAllCtors &&) = default; - ExplicitAllCtors& operator=(ExplicitAllCtors const&) = default; - ExplicitAllCtors& operator=(ExplicitAllCtors &&) = default; -}; - -struct ExplicitCopyable { - explicit ExplicitCopyable() = default; - explicit ExplicitCopyable(ExplicitCopyable const &) = default; - ExplicitCopyable &operator=(ExplicitCopyable const &) = default; -}; - -struct ExplicitCopyOnly { - explicit ExplicitCopyOnly() = default; - explicit ExplicitCopyOnly(ExplicitCopyOnly const &) = default; - ExplicitCopyOnly &operator=(ExplicitCopyOnly const &) = default; - explicit ExplicitCopyOnly(ExplicitCopyOnly &&) = delete; - ExplicitCopyOnly &operator=(ExplicitCopyOnly &&) = delete; -}; - -struct ExplicitNonCopyable { - explicit ExplicitNonCopyable() = default; - explicit ExplicitNonCopyable(ExplicitNonCopyable const &) = delete; - ExplicitNonCopyable &operator=(ExplicitNonCopyable const &) = delete; -}; - -struct ExplicitMoveOnly { - explicit ExplicitMoveOnly() = default; - explicit ExplicitMoveOnly(ExplicitMoveOnly &&) = default; - ExplicitMoveOnly &operator=(ExplicitMoveOnly &&) = default; -}; +//============================================================================// +// Non-Trivially Copyable Implicit Test Types +namespace NonTrivialTypes { +#define DEFINE_CTOR {} +#include "archetypes.ipp" +} #endif // TEST_STD_VER >= 11 diff --git a/test/support/archetypes.ipp b/test/support/archetypes.ipp new file mode 100644 index 000000000..094440a97 --- /dev/null +++ b/test/support/archetypes.ipp @@ -0,0 +1,109 @@ + +#ifndef DEFINE_EXPLICIT +#define DEFINE_EXPLICIT +#endif +#ifndef DEFINE_CTOR +#define DEFINE_CTOR = default +#endif +#ifndef DEFINE_ASSIGN +#define DEFINE_ASSIGN = default +#endif +#ifndef DEFINE_DTOR +#define DEFINE_DTOR(Name) +#endif + +struct NoDefault { + DEFINE_EXPLICIT NoDefault() = delete; + DEFINE_DTOR(NoDefault) +}; + +struct AllCtors { + DEFINE_EXPLICIT AllCtors() DEFINE_CTOR; + DEFINE_EXPLICIT AllCtors(AllCtors const&) DEFINE_CTOR; + DEFINE_EXPLICIT AllCtors(AllCtors &&) DEFINE_CTOR; + AllCtors& operator=(AllCtors const&) DEFINE_ASSIGN; + AllCtors& operator=(AllCtors &&) DEFINE_ASSIGN; + DEFINE_DTOR(AllCtors) +}; + +struct Copyable { + DEFINE_EXPLICIT Copyable() DEFINE_CTOR; + DEFINE_EXPLICIT Copyable(Copyable const &) DEFINE_CTOR; + Copyable &operator=(Copyable const &) DEFINE_ASSIGN; + DEFINE_DTOR(Copyable) +}; + +struct CopyOnly { + DEFINE_EXPLICIT CopyOnly() DEFINE_CTOR; + DEFINE_EXPLICIT CopyOnly(CopyOnly const &) DEFINE_CTOR; + DEFINE_EXPLICIT CopyOnly(CopyOnly &&) = delete; + CopyOnly &operator=(CopyOnly const &) DEFINE_ASSIGN; + CopyOnly &operator=(CopyOnly &&) = delete; + DEFINE_DTOR(CopyOnly) +}; + +struct NonCopyable { + DEFINE_EXPLICIT NonCopyable() DEFINE_CTOR; + DEFINE_EXPLICIT NonCopyable(NonCopyable const &) = delete; + NonCopyable &operator=(NonCopyable const &) = delete; + DEFINE_DTOR(NonCopyable) +}; + +struct MoveOnly { + DEFINE_EXPLICIT MoveOnly() DEFINE_CTOR; + DEFINE_EXPLICIT MoveOnly(MoveOnly &&) DEFINE_CTOR; + MoveOnly &operator=(MoveOnly &&) DEFINE_ASSIGN; + DEFINE_DTOR(MoveOnly) +}; + +struct CopyAssignable { + DEFINE_EXPLICIT CopyAssignable() = delete; + CopyAssignable& operator=(CopyAssignable const&) DEFINE_ASSIGN; + DEFINE_DTOR(CopyAssignable) +}; + +struct CopyAssignOnly { + DEFINE_EXPLICIT CopyAssignOnly() = delete; + CopyAssignOnly& operator=(CopyAssignOnly const&) DEFINE_ASSIGN; + CopyAssignOnly& operator=(CopyAssignOnly &&) = delete; + DEFINE_DTOR(CopyAssignOnly) +}; + +struct MoveAssignOnly { + DEFINE_EXPLICIT MoveAssignOnly() = delete; + MoveAssignOnly& operator=(MoveAssignOnly const&) = delete; + MoveAssignOnly& operator=(MoveAssignOnly &&) DEFINE_ASSIGN; + DEFINE_DTOR(MoveAssignOnly) +}; + +struct ConvertingType { + DEFINE_EXPLICIT ConvertingType() DEFINE_CTOR; + DEFINE_EXPLICIT ConvertingType(ConvertingType const&) DEFINE_CTOR; + DEFINE_EXPLICIT ConvertingType(ConvertingType &&) DEFINE_CTOR; + ConvertingType& operator=(ConvertingType const&) DEFINE_ASSIGN; + ConvertingType& operator=(ConvertingType &&) DEFINE_ASSIGN; + template + DEFINE_EXPLICIT ConvertingType(Args&&...) {} + template + ConvertingType& operator=(Arg&&) { return *this; } + DEFINE_DTOR(ConvertingType) +}; + +template