diff options
| author | Michael Park <mcypark@gmail.com> | 2017-06-19 08:25:57 +0000 |
|---|---|---|
| committer | Michael Park <mcypark@gmail.com> | 2017-06-19 08:25:57 +0000 |
| commit | 3f1e89380b294a1192fa4019053dc5ab3c8eacbf (patch) | |
| tree | a5a11f8ea63a909879c81ec8b5553abbbeb563a0 | |
| parent | f92659e4ea0196d081ff714220e004f63d7fc5ef (diff) | |
| download | bcm5719-llvm-3f1e89380b294a1192fa4019053dc5ab3c8eacbf.tar.gz bcm5719-llvm-3f1e89380b294a1192fa4019053dc5ab3c8eacbf.zip | |
Add a missing SFINAE condition to the `variant`'s converting constructor.
Remarks: This function shall not participate in overload resolution unless
`is_same_v<decay_t<T>, variant>` is false, unless `decay_t<T>` is
neither a specialization of `in_place_type_t` nor a specialization of
`in_place_index_t`, unless `is_constructible_v<Tj, T>` is true, and
unless the expression `FUN(std::forward<T>(t))` (with `FUN` being the
above-mentioned set of imaginary functions) is well formed.
Depends on D34111.
Reviewers: EricWF, K-ballo
Reviewed By: EricWF
Subscribers: fhahn
Differential Revision: https://reviews.llvm.org/D34112
llvm-svn: 305668
| -rw-r--r-- | libcxx/include/variant | 2 | ||||
| -rw-r--r-- | libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp | 14 |
2 files changed, 16 insertions, 0 deletions
diff --git a/libcxx/include/variant b/libcxx/include/variant index 8711ef6eb38..f8d3e28bae4 100644 --- a/libcxx/include/variant +++ b/libcxx/include/variant @@ -1116,6 +1116,8 @@ public: template < class _Arg, enable_if_t<!is_same_v<decay_t<_Arg>, variant>, int> = 0, + enable_if_t<!__is_inplace_type<decay_t<_Arg>>::value, int> = 0, + enable_if_t<!__is_inplace_index<decay_t<_Arg>>::value, int> = 0, class _Tp = __variant_detail::__best_match_t<_Arg, _Types...>, size_t _Ip = __find_detail::__find_unambiguous_index_sfinae<_Tp, _Types...>::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 d33ea0bd3f4..3f7cd4f0b6d 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 @@ -37,6 +37,9 @@ struct NoThrowT { NoThrowT(int) noexcept(true) {} }; +struct AnyConstructible { template <typename T> AnyConstructible(T&&) {} }; +struct NoConstructible { NoConstructible() = delete; }; + void test_T_ctor_noexcept() { { using V = std::variant<Dummy, NoThrowT>; @@ -62,6 +65,17 @@ void test_T_ctor_sfinae() { static_assert(!std::is_constructible<V, int>::value, "no matching constructor"); } + { + using V = std::variant<AnyConstructible, NoConstructible>; + static_assert( + !std::is_constructible<V, std::in_place_type_t<NoConstructible>>::value, + "no matching constructor"); + static_assert(!std::is_constructible<V, std::in_place_index_t<1>>::value, + "no matching constructor"); + } + + + #if !defined(TEST_VARIANT_HAS_NO_REFERENCES) { using V = std::variant<int, int &&>; |

