summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Park <mcypark@gmail.com>2017-06-19 08:25:57 +0000
committerMichael Park <mcypark@gmail.com>2017-06-19 08:25:57 +0000
commit3f1e89380b294a1192fa4019053dc5ab3c8eacbf (patch)
treea5a11f8ea63a909879c81ec8b5553abbbeb563a0
parentf92659e4ea0196d081ff714220e004f63d7fc5ef (diff)
downloadbcm5719-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/variant2
-rw-r--r--libcxx/test/std/utilities/variant/variant.variant/variant.ctor/T.pass.cpp14
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 &&>;
OpenPOWER on IntegriCloud