Implement LWG 2842 - optional(U&&) needs to SFINAE on decay_t<in_place_t>

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@299100 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Fiselier
2017-03-30 19:43:50 +00:00
parent 9783bae928
commit 5612bd42dc
3 changed files with 16 additions and 2 deletions

View File

@@ -35,6 +35,11 @@ struct ExplicitThrow
constexpr explicit ExplicitThrow(int x) { if (x != -1) TEST_THROW(6);}
};
struct ImplicitAny {
template <class U>
constexpr ImplicitAny(U&&) {}
};
template <class To, class From>
constexpr bool implicit_conversion(optional<To>&& opt, const From& v)
@@ -79,6 +84,15 @@ void test_implicit()
using T = TestTypes::TestType;
assert(implicit_conversion<T>(3, T(3)));
}
{
using O = optional<ImplicitAny>;
static_assert(!test_convertible<O, std::in_place_t>(), "");
static_assert(!test_convertible<O, std::in_place_t&>(), "");
static_assert(!test_convertible<O, const std::in_place_t&>(), "");
static_assert(!test_convertible<O, std::in_place_t&&>(), "");
static_assert(!test_convertible<O, const std::in_place_t&&>(), "");
}
#ifndef TEST_HAS_NO_EXCEPTIONS
{
try {