summaryrefslogtreecommitdiffstats
path: root/libcxx/test/std/utilities
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx/test/std/utilities')
-rw-r--r--libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp5
-rw-r--r--libcxx/test/std/utilities/variant/variant.variant/variant.assign/conv.fail.cpp52
-rw-r--r--libcxx/test/std/utilities/variant/variant.variant/variant.assign/conv.pass.cpp43
-rw-r--r--libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp4
-rw-r--r--libcxx/test/std/utilities/variant/variant.variant/variant.ctor/conv.fail.cpp39
-rw-r--r--libcxx/test/std/utilities/variant/variant.variant/variant.ctor/conv.pass.cpp42
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, "");
+
+}
OpenPOWER on IntegriCloud