diff options
Diffstat (limited to 'libcxx/test/std/utilities')
6 files changed, 92 insertions, 93 deletions
diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp index b2b53d6c6ea..ab4ea7e4cf2 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp @@ -136,7 +136,8 @@ void test_T_assignment_sfinae() { } { using V = std::variant<std::string, float>; - static_assert(!std::is_assignable<V, int>::value, "no matching operator="); + static_assert(std::is_assignable<V, int>::value == VariantAllowsNarrowingConversions, + "no matching operator="); } { using V = std::variant<std::unique_ptr<int>, bool>; @@ -187,6 +188,7 @@ void test_T_assignment_basic() { assert(v.index() == 1); assert(std::get<1>(v) == 43); } +#ifndef TEST_VARIANT_ALLOWS_NARROWING_CONVERSIONS { std::variant<unsigned, long> v; v = 42; @@ -196,6 +198,7 @@ void test_T_assignment_basic() { assert(v.index() == 0); assert(std::get<0>(v) == 43); } +#endif { std::variant<std::string, bool> v = true; v = "bar"; diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/conv.fail.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/conv.fail.cpp deleted file mode 100644 index d5f370d2720..00000000000 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/conv.fail.cpp +++ /dev/null @@ -1,52 +0,0 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// UNSUPPORTED: c++98, c++03, c++11, c++14 - -// <variant> - -// template <class ...Types> class variant; - -// template <class T> -// variant& operator=(T&&) noexcept(see below); - -#include <variant> -#include <string> -#include <memory> - -int main(int, char**) -{ - std::variant<int, int> v1; - std::variant<long, long long> v2; - std::variant<char> v3; - v1 = 1; // expected-error {{no viable overloaded '='}} - v2 = 1; // expected-error {{no viable overloaded '='}} - v3 = 1; // expected-error {{no viable overloaded '='}} - - std::variant<std::string, float> v4; - std::variant<std::string, double> v5; - std::variant<std::string, bool> v6; - v4 = 1; // expected-error {{no viable overloaded '='}} - v5 = 1; // expected-error {{no viable overloaded '='}} - v6 = 1; // expected-error {{no viable overloaded '='}} - - std::variant<int, bool> v7; - std::variant<int, bool const> v8; - std::variant<int, bool volatile> v9; - v7 = "meow"; // expected-error {{no viable overloaded '='}} - v8 = "meow"; // expected-error {{no viable overloaded '='}} - v9 = "meow"; // expected-error {{no viable overloaded '='}} - - std::variant<bool> v10; - std::variant<bool> v11; - std::variant<bool> v12; - v10 = std::true_type(); // expected-error {{no viable overloaded '='}} - v11 = std::unique_ptr<char>(); // expected-error {{no viable overloaded '='}} - v12 = nullptr; // expected-error {{no viable overloaded '='}} -} diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.assign/conv.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/conv.pass.cpp new file mode 100644 index 00000000000..b16cf2cdd58 --- /dev/null +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.assign/conv.pass.cpp @@ -0,0 +1,43 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11, c++14 + +// <variant> + +// template <class ...Types> class variant; + +// template <class T> +// variant& operator=(T&&) noexcept(see below); + +#include <variant> +#include <string> +#include <memory> + +#include "variant_test_helpers.hpp" + +int main(int, char**) +{ + static_assert(!std::is_assignable<std::variant<int, int>, int>::value, ""); + static_assert(!std::is_assignable<std::variant<long, long long>, int>::value, ""); + static_assert(std::is_assignable<std::variant<char>, int>::value == VariantAllowsNarrowingConversions, ""); + + static_assert(std::is_assignable<std::variant<std::string, float>, int>::value == VariantAllowsNarrowingConversions, ""); + static_assert(std::is_assignable<std::variant<std::string, double>, int>::value == VariantAllowsNarrowingConversions, ""); + static_assert(!std::is_assignable<std::variant<std::string, bool>, int>::value, ""); + + static_assert(!std::is_assignable<std::variant<int, bool>, decltype("meow")>::value, ""); + static_assert(!std::is_assignable<std::variant<int, const bool>, decltype("meow")>::value, ""); + static_assert(!std::is_assignable<std::variant<int, const volatile bool>, decltype("meow")>::value, ""); + + static_assert(!std::is_assignable<std::variant<bool>, std::true_type>::value, ""); + static_assert(!std::is_assignable<std::variant<bool>, std::unique_ptr<char> >::value, ""); + static_assert(!std::is_assignable<std::variant<bool>, decltype(nullptr)>::value, ""); + +} diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp index 40fa20b4f5e..55f8d11c115 100644 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp @@ -69,7 +69,7 @@ void test_T_ctor_sfinae() { } { using V = std::variant<std::string, float>; - static_assert(!std::is_constructible<V, int>::value, + static_assert(std::is_constructible<V, int>::value == VariantAllowsNarrowingConversions, "no matching constructor"); } { @@ -127,11 +127,13 @@ void test_T_ctor_basic() { static_assert(v.index() == 1, ""); static_assert(std::get<1>(v) == 42, ""); } +#ifndef TEST_VARIANT_ALLOWS_NARROWING_CONVERSIONS { constexpr std::variant<unsigned, long> v(42); static_assert(v.index() == 1, ""); static_assert(std::get<1>(v) == 42, ""); } +#endif { std::variant<std::string, bool const> v = "foo"; assert(v.index() == 0); diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/conv.fail.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/conv.fail.cpp deleted file mode 100644 index 76b42ac226d..00000000000 --- a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/conv.fail.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// -*- C++ -*- -//===----------------------------------------------------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -// UNSUPPORTED: c++98, c++03, c++11, c++14 - -// <variant> - -// template <class ...Types> class variant; - -// template <class T> constexpr variant(T&&) noexcept(see below); - -#include <variant> -#include <string> -#include <memory> - -int main(int, char**) -{ - std::variant<int, int> v1 = 1; // expected-error {{no viable conversion}} - std::variant<long, long long> v2 = 1; // expected-error {{no viable conversion}} - std::variant<char> v3 = 1; // expected-error {{no viable conversion}} - - std::variant<std::string, float> v4 = 1; // expected-error {{no viable conversion}} - std::variant<std::string, double> v5 = 1; // expected-error {{no viable conversion}} - std::variant<std::string, bool> v6 = 1; // expected-error {{no viable conversion}} - - std::variant<int, bool> v7 = "meow"; // expected-error {{no viable conversion}} - std::variant<int, bool const> v8 = "meow"; // expected-error {{no viable conversion}} - std::variant<int, bool volatile> v9 = "meow"; // expected-error {{no viable conversion}} - - std::variant<bool> v10 = std::true_type(); // expected-error {{no viable conversion}} - std::variant<bool> v11 = std::unique_ptr<char>(); // expected-error {{no viable conversion}} - std::variant<bool> v12 = nullptr; // expected-error {{no viable conversion}} -} diff --git a/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/conv.pass.cpp b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/conv.pass.cpp new file mode 100644 index 00000000000..47991233a56 --- /dev/null +++ b/libcxx/test/std/utilities/variant/variant.variant/variant.ctor/conv.pass.cpp @@ -0,0 +1,42 @@ +// -*- C++ -*- +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11, c++14 + +// <variant> + +// template <class ...Types> class variant; + +// template <class T> constexpr variant(T&&) noexcept(see below); + +#include <variant> +#include <string> +#include <memory> + +#include "variant_test_helpers.hpp" + +int main(int, char**) +{ + static_assert(!std::is_constructible<std::variant<int, int>, int>::value, ""); + static_assert(!std::is_constructible<std::variant<long, long long>, int>::value, ""); + static_assert(std::is_constructible<std::variant<char>, int>::value == VariantAllowsNarrowingConversions, ""); + + static_assert(std::is_constructible<std::variant<std::string, float>, int>::value == VariantAllowsNarrowingConversions, ""); + static_assert(std::is_constructible<std::variant<std::string, double>, int>::value == VariantAllowsNarrowingConversions, ""); + static_assert(!std::is_constructible<std::variant<std::string, bool>, int>::value, ""); + + static_assert(!std::is_constructible<std::variant<int, bool>, decltype("meow")>::value, ""); + static_assert(!std::is_constructible<std::variant<int, const bool>, decltype("meow")>::value, ""); + static_assert(!std::is_constructible<std::variant<int, const volatile bool>, decltype("meow")>::value, ""); + + static_assert(!std::is_constructible<std::variant<bool>, std::true_type>::value, ""); + static_assert(!std::is_constructible<std::variant<bool>, std::unique_ptr<char> >::value, ""); + static_assert(!std::is_constructible<std::variant<bool>, decltype(nullptr)>::value, ""); + +} |

