CaseyCarter created this revision. CaseyCarter added reviewers: EricWF, mclow.lists. CaseyCarter added a subscriber: cfe-commits. CaseyCarter set the repository for this revision to rL LLVM.
Cleanup nonportable behavior in tests for `std::any` Fixes MS issues 63, 64, and 65. test/std/utilities/any/any.class/any.cons/move.pass.cpp: - "Moves are always destructive" is not a portable assumption; check with `LIBCPP_ASSERT`. test/std/utilities/any/any.class/any.cons/value.pass.cpp: test/libcxx/utilities/any/any.class/any.cons/value.pass.cpp: - The standard does not forbid initializing `std::any` from any pointer-to-function type. The `DecayTag` test is a libc++ extension (at best); factor it out into a test in the libcxx hierarchy. test/std/utilities/any/any.class/any.modifiers/swap.pass.cpp: - Self-swap is not specified to perform no moves; check with `LIBCPP_ASSERT`. Repository: rL LLVM https://reviews.llvm.org/D26007 Files: test/libcxx/utilities/any/any.class/any.cons/value.pass.cpp test/std/utilities/any/any.class/any.cons/move.pass.cpp test/std/utilities/any/any.class/any.cons/value.pass.cpp test/std/utilities/any/any.class/any.modifiers/swap.pass.cpp Index: test/std/utilities/any/any.class/any.modifiers/swap.pass.cpp =================================================================== --- test/std/utilities/any/any.class/any.modifiers/swap.pass.cpp +++ test/std/utilities/any/any.class/any.modifiers/swap.pass.cpp @@ -104,7 +104,7 @@ assertContains<T>(a, 42); assert(T::count == 1); assert(T::copied == 0); - assert(T::moved == 0); + LIBCPP_ASSERT(T::moved == 0); } assert(small::count == 0); { // large @@ -113,9 +113,9 @@ T::reset(); a.swap(a); assertContains<T>(a, 42); - assert(T::copied == 0); - assert(T::moved == 0); assert(T::count == 1); + assert(T::copied == 0); + LIBCPP_ASSERT(T::moved == 0); } assert(large::count == 0); } Index: test/std/utilities/any/any.class/any.cons/value.pass.cpp =================================================================== --- test/std/utilities/any/any.class/any.cons/value.pass.cpp +++ test/std/utilities/any/any.class/any.cons/value.pass.cpp @@ -137,10 +137,6 @@ static_assert(!std::is_constructible<std::any, T>::value, ""); } { - using DecayTag = std::decay_t<BadTag>; - static_assert(!std::is_constructible<std::any, DecayTag>::value, ""); - } - { // Test that the ValueType&& constructor SFINAE's away when the // argument is non-copyable struct NoCopy { Index: test/std/utilities/any/any.class/any.cons/move.pass.cpp =================================================================== --- test/std/utilities/any/any.class/any.cons/move.pass.cpp +++ test/std/utilities/any/any.class/any.cons/move.pass.cpp @@ -80,8 +80,8 @@ assert(Type::moved == 1 || Type::moved == 2); // zero or more move operations can be performed. assert(Type::copied == 0); // no copies can be performed. assert(Type::count == 1 + a.has_value()); - assertEmpty(a); // Moves are always destructive. assertContains<Type>(a2, 42); + LIBCPP_ASSERT(!a.has_value()); // Moves are always destructive. if (a.has_value()) assertContains<Type>(a, 0); } Index: test/libcxx/utilities/any/any.class/any.cons/value.pass.cpp =================================================================== --- /dev/null +++ test/libcxx/utilities/any/any.class/any.cons/value.pass.cpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11, c++14 + +// <any> + +// template <class Value> any(Value &&) + +// Test construction from a value. +// Concerns: +// --------- +// 1. The value is properly move/copied depending on the value category. +// 2. Both small and large values are properly handled. + + +#include <any> +#include <type_traits> + +#include "test_macros.h" + +using std::any; +using std::any_cast; + +int main() { + // Test that any(ValueType&&) is *never* selected for a std::in_place type. + // Test that the tag type is properly handled in SFINAE + using BadTag = std::in_place_type_t<int>; + using DecayTag = std::decay_t<BadTag>; + static_assert(!std::is_constructible<std::any, DecayTag>::value, ""); +}
Index: test/std/utilities/any/any.class/any.modifiers/swap.pass.cpp =================================================================== --- test/std/utilities/any/any.class/any.modifiers/swap.pass.cpp +++ test/std/utilities/any/any.class/any.modifiers/swap.pass.cpp @@ -104,7 +104,7 @@ assertContains<T>(a, 42); assert(T::count == 1); assert(T::copied == 0); - assert(T::moved == 0); + LIBCPP_ASSERT(T::moved == 0); } assert(small::count == 0); { // large @@ -113,9 +113,9 @@ T::reset(); a.swap(a); assertContains<T>(a, 42); - assert(T::copied == 0); - assert(T::moved == 0); assert(T::count == 1); + assert(T::copied == 0); + LIBCPP_ASSERT(T::moved == 0); } assert(large::count == 0); } Index: test/std/utilities/any/any.class/any.cons/value.pass.cpp =================================================================== --- test/std/utilities/any/any.class/any.cons/value.pass.cpp +++ test/std/utilities/any/any.class/any.cons/value.pass.cpp @@ -137,10 +137,6 @@ static_assert(!std::is_constructible<std::any, T>::value, ""); } { - using DecayTag = std::decay_t<BadTag>; - static_assert(!std::is_constructible<std::any, DecayTag>::value, ""); - } - { // Test that the ValueType&& constructor SFINAE's away when the // argument is non-copyable struct NoCopy { Index: test/std/utilities/any/any.class/any.cons/move.pass.cpp =================================================================== --- test/std/utilities/any/any.class/any.cons/move.pass.cpp +++ test/std/utilities/any/any.class/any.cons/move.pass.cpp @@ -80,8 +80,8 @@ assert(Type::moved == 1 || Type::moved == 2); // zero or more move operations can be performed. assert(Type::copied == 0); // no copies can be performed. assert(Type::count == 1 + a.has_value()); - assertEmpty(a); // Moves are always destructive. assertContains<Type>(a2, 42); + LIBCPP_ASSERT(!a.has_value()); // Moves are always destructive. if (a.has_value()) assertContains<Type>(a, 0); } Index: test/libcxx/utilities/any/any.class/any.cons/value.pass.cpp =================================================================== --- /dev/null +++ test/libcxx/utilities/any/any.class/any.cons/value.pass.cpp @@ -0,0 +1,37 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11, c++14 + +// <any> + +// template <class Value> any(Value &&) + +// Test construction from a value. +// Concerns: +// --------- +// 1. The value is properly move/copied depending on the value category. +// 2. Both small and large values are properly handled. + + +#include <any> +#include <type_traits> + +#include "test_macros.h" + +using std::any; +using std::any_cast; + +int main() { + // Test that any(ValueType&&) is *never* selected for a std::in_place type. + // Test that the tag type is properly handled in SFINAE + using BadTag = std::in_place_type_t<int>; + using DecayTag = std::decay_t<BadTag>; + static_assert(!std::is_constructible<std::any, DecayTag>::value, ""); +}
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits