diff options
author | Zhihao Yuan <zy@miator.net> | 2019-06-20 22:09:40 +0000 |
---|---|---|
committer | Zhihao Yuan <zy@miator.net> | 2019-06-20 22:09:40 +0000 |
commit | 4513f0f0224fd34bbebfdc7aa6bb78a995a6ac7b (patch) | |
tree | 78444464ad379229d754ae1e5ad8f8655f9a4f81 /libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp | |
parent | 944a7117e929daaa1353b354c24c1fdb5efb3f50 (diff) | |
download | bcm5719-llvm-4513f0f0224fd34bbebfdc7aa6bb78a995a6ac7b.tar.gz bcm5719-llvm-4513f0f0224fd34bbebfdc7aa6bb78a995a6ac7b.zip |
[libc++] Recommit r363692 to implement P0608R3
Re-apply the change which was reverted in r363764 as-is after
breakages being resolved. Thanks Eric Fiselier for working
hard on this.
See also: https://bugs.llvm.org/show_bug.cgi?id=42330
Differential Revision: https://reviews.llvm.org/D44865
llvm-svn: 363993
Diffstat (limited to 'libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp')
-rw-r--r-- | libcxx/test/std/utilities/variant/variant.variant/variant.assign/T.pass.cpp | 59 |
1 files changed, 58 insertions, 1 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 02498b1acde..b2b53d6c6ea 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 @@ -22,6 +22,7 @@ #include <string> #include <type_traits> #include <variant> +#include <memory> #include "test_macros.h" #include "variant_test_helpers.hpp" @@ -122,7 +123,7 @@ void test_T_assignment_noexcept() { void test_T_assignment_sfinae() { { - using V = std::variant<long, unsigned>; + using V = std::variant<long, long long>; static_assert(!std::is_assignable<V, int>::value, "ambiguous"); } { @@ -133,6 +134,31 @@ void test_T_assignment_sfinae() { using V = std::variant<std::string, void *>; static_assert(!std::is_assignable<V, int>::value, "no matching operator="); } + { + using V = std::variant<std::string, float>; + static_assert(!std::is_assignable<V, int>::value, "no matching operator="); + } + { + using V = std::variant<std::unique_ptr<int>, bool>; + static_assert(!std::is_assignable<V, std::unique_ptr<char>>::value, + "no explicit bool in operator="); + struct X { + operator void*(); + }; + static_assert(!std::is_assignable<V, X>::value, + "no boolean conversion in operator="); + static_assert(!std::is_assignable<V, std::false_type>::value, + "no converted to bool in operator="); + } + { + struct X {}; + struct Y { + operator X(); + }; + using V = std::variant<X>; + static_assert(std::is_assignable<V, Y>::value, + "regression on user-defined conversions in operator="); + } #if !defined(TEST_VARIANT_HAS_NO_REFERENCES) { using V = std::variant<int, int &&>; @@ -161,6 +187,37 @@ void test_T_assignment_basic() { assert(v.index() == 1); assert(std::get<1>(v) == 43); } + { + std::variant<unsigned, long> v; + v = 42; + assert(v.index() == 1); + assert(std::get<1>(v) == 42); + v = 43u; + assert(v.index() == 0); + assert(std::get<0>(v) == 43); + } + { + std::variant<std::string, bool> v = true; + v = "bar"; + assert(v.index() == 0); + assert(std::get<0>(v) == "bar"); + } + { + std::variant<bool, std::unique_ptr<int>> v; + v = nullptr; + assert(v.index() == 1); + assert(std::get<1>(v) == nullptr); + } + { + std::variant<bool volatile, int> v = 42; + v = false; + assert(v.index() == 0); + assert(!std::get<0>(v)); + bool lvt = true; + v = lvt; + assert(v.index() == 0); + assert(std::get<0>(v)); + } #if !defined(TEST_VARIANT_HAS_NO_REFERENCES) { using V = std::variant<int &, int &&, long>; |