From c0e388d4e89c1ee7bd11b77a72880f5a5e5be459 Mon Sep 17 00:00:00 2001 From: Michael Schellenberger Costa Date: Wed, 16 Aug 2023 12:26:27 +0200 Subject: [PATCH 1/4] Fix `cpp20_random_access_iterator` for old MSVC --- libcudacxx/.upstream-tests/test/support/test_iterators.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libcudacxx/.upstream-tests/test/support/test_iterators.h b/libcudacxx/.upstream-tests/test/support/test_iterators.h index 9399a31186..303f5f7a4d 100644 --- a/libcudacxx/.upstream-tests/test/support/test_iterators.h +++ b/libcudacxx/.upstream-tests/test/support/test_iterators.h @@ -233,11 +233,11 @@ class random_access_iterator #if TEST_STD_VER > 14 static_assert(cuda::std::random_access_iterator>, ""); -template >> +template class cpp20_random_access_iterator { It it_; - template + template friend class cpp20_random_access_iterator; public: From 3e5a5177efcf28a14561e0b76abed5aa2dddbbe1 Mon Sep 17 00:00:00 2001 From: Michael Schellenberger Costa Date: Wed, 16 Aug 2023 12:27:05 +0200 Subject: [PATCH 2/4] Remove warning reenablement in tests --- libcudacxx/.upstream-tests/test/support/test_iterators.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libcudacxx/.upstream-tests/test/support/test_iterators.h b/libcudacxx/.upstream-tests/test/support/test_iterators.h index 303f5f7a4d..28ae182f58 100644 --- a/libcudacxx/.upstream-tests/test/support/test_iterators.h +++ b/libcudacxx/.upstream-tests/test/support/test_iterators.h @@ -1032,10 +1032,6 @@ TEST_NV_DIAG_SUPPRESS(1805) // MSVC complains that if we pass a pointer type, ad return *this; } -#if defined(TEST_COMPILER_MSVC) -TEST_NV_DIAG_DEFAULT(1805) -#endif // TEST_COMPILER_MSVC - // If `T` is a reference type, the implicitly-generated assignment operator will be deleted (and would take precedence // over the templated `operator=` above because it's a better match). __host__ __device__ constexpr Proxy& operator=(const Proxy& rhs) { From caed608b31aff8d44062bab181c1c7629da39585 Mon Sep 17 00:00:00 2001 From: Michael Schellenberger Costa Date: Wed, 16 Aug 2023 12:35:14 +0200 Subject: [PATCH 3/4] Disable broken tests for MSVC2017 it seems there are issues to determine `common_reference_with` which is one of the foundational concepts. Funnily enough each individual component of the concept checks out, but put together things happen. --- .../alg.req.ind.copy/indirectly_copyable.compile.pass.cpp | 4 ++++ .../alg.req.ind.move/indirectly_movable.compile.pass.cpp | 4 ++++ .../indirectly_movable_storable.compile.pass.cpp | 2 ++ .../iterator.concept.input/input_iterator.compile.pass.cpp | 3 +++ .../contiguous_iterator.compile.pass.cpp | 3 +++ .../random_access_iterator.compile.pass.cpp | 2 ++ .../sentinel_for.compile.pass.cpp | 5 +++++ .../weakly_incrementable.compile.pass.cpp | 2 ++ libcudacxx/.upstream-tests/test/support/test_iterators.h | 7 +++++++ 9 files changed, 32 insertions(+) diff --git a/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/alg.req.ind.copy/indirectly_copyable.compile.pass.cpp b/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/alg.req.ind.copy/indirectly_copyable.compile.pass.cpp index 0f9c1798d1..1ef4935931 100644 --- a/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/alg.req.ind.copy/indirectly_copyable.compile.pass.cpp +++ b/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/alg.req.ind.copy/indirectly_copyable.compile.pass.cpp @@ -60,10 +60,12 @@ static_assert(!cuda::std::indirectly_copyable); static_assert(!cuda::std::indirectly_copyable); // Can copy copy-only objects. +#ifndef TEST_COMPILER_MSVC_2017 // MSVC2017 has issues determining common_reference static_assert( cuda::std::indirectly_copyable); static_assert(!cuda::std::indirectly_copyable); static_assert( cuda::std::indirectly_copyable); static_assert(!cuda::std::indirectly_copyable); +#endif // TEST_COMPILER_MSVC_2017 template struct PointerTo { @@ -71,6 +73,7 @@ struct PointerTo { __host__ __device__ T& operator*() const; }; +#ifndef TEST_COMPILER_MSVC_2017 // MSVC2017 has issues determining common_reference // Can copy through a dereferenceable class. static_assert( cuda::std::indirectly_copyable>); static_assert(!cuda::std::indirectly_copyable>); @@ -79,6 +82,7 @@ static_assert(!cuda::std::indirectly_copyable, PointerTo>); static_assert( cuda::std::indirectly_copyable, CopyOnly*>); static_assert( cuda::std::indirectly_copyable, PointerTo>); +#endif // TEST_COMPILER_MSVC_2017 int main(int, char**) { diff --git a/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/alg.req.ind.move/indirectly_movable.compile.pass.cpp b/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/alg.req.ind.move/indirectly_movable.compile.pass.cpp index bc3a21b656..a9d7ee5ae0 100644 --- a/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/alg.req.ind.move/indirectly_movable.compile.pass.cpp +++ b/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/alg.req.ind.move/indirectly_movable.compile.pass.cpp @@ -41,11 +41,13 @@ static_assert(!cuda::std::indirectly_movable); static_assert(!cuda::std::indirectly_movable); static_assert(!cuda::std::indirectly_movable); +#ifndef TEST_COMPILER_MSVC_2017 // MSVC2017 has issues determining common_reference // Can move move-only objects. static_assert( cuda::std::indirectly_movable); static_assert(!cuda::std::indirectly_movable); static_assert(!cuda::std::indirectly_movable); static_assert(!cuda::std::indirectly_movable); +#endif // TEST_COMPILER_MSVC_2017 template struct PointerTo { @@ -53,6 +55,7 @@ struct PointerTo { __host__ __device__ T& operator*() const; }; +#ifndef TEST_COMPILER_MSVC_2017 // MSVC2017 has issues determining common_reference // Can copy through a dereferenceable class. static_assert( cuda::std::indirectly_movable>); static_assert(!cuda::std::indirectly_movable>); @@ -61,6 +64,7 @@ static_assert(!cuda::std::indirectly_copyable, PointerTo>); static_assert( cuda::std::indirectly_movable, MoveOnly*>); static_assert( cuda::std::indirectly_movable, PointerTo>); +#endif // TEST_COMPILER_MSVC_2017 int main(int, char**) { diff --git a/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/alg.req.ind.move/indirectly_movable_storable.compile.pass.cpp b/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/alg.req.ind.move/indirectly_movable_storable.compile.pass.cpp index 5fdb74e1e6..d012d6cc89 100644 --- a/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/alg.req.ind.move/indirectly_movable_storable.compile.pass.cpp +++ b/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/alg.req.ind.move/indirectly_movable_storable.compile.pass.cpp @@ -31,8 +31,10 @@ static_assert(!cuda::std::indirectly_movable_storable); static_assert(!cuda::std::indirectly_movable_storable); static_assert( cuda::std::indirectly_movable_storable); static_assert(!cuda::std::indirectly_movable_storable); +#ifndef TEST_COMPILER_MSVC_2017 // MSVC2017 has issues determining common_reference static_assert( cuda::std::indirectly_movable_storable); static_assert( cuda::std::indirectly_movable_storable, PointerTo>); +#endif // TEST_COMPILER_MSVC_2017 // The dereference operator returns a different type from `value_type` and the reference type cannot be assigned from a // `ValueType`. diff --git a/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.input/input_iterator.compile.pass.cpp b/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.input/input_iterator.compile.pass.cpp index c15b1de2d9..ed99b55d39 100644 --- a/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.input/input_iterator.compile.pass.cpp +++ b/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.input/input_iterator.compile.pass.cpp @@ -15,6 +15,7 @@ #include #include "test_iterators.h" +#include "test_macros.h" static_assert(cuda::std::input_iterator >); static_assert(cuda::std::input_iterator >); @@ -36,8 +37,10 @@ struct no_explicit_iter_concept { __host__ __device__ no_explicit_iter_concept& operator++(); __host__ __device__ void operator++(int); }; +#ifndef TEST_COMPILER_MSVC_2017 // ITER-CONCEPT is `random_access_iterator_tag` >:( static_assert(cuda::std::input_iterator); +#endif // TEST_COMPILER_MSVC_2017 static_assert(cuda::std::input_iterator); static_assert(cuda::std::input_iterator); diff --git a/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.random.access/contiguous_iterator.compile.pass.cpp b/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.random.access/contiguous_iterator.compile.pass.cpp index ef02750479..a5adceeb95 100644 --- a/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.random.access/contiguous_iterator.compile.pass.cpp +++ b/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.random.access/contiguous_iterator.compile.pass.cpp @@ -15,6 +15,7 @@ #include #include "test_iterators.h" +#include "test_macros.h" static_assert(!cuda::std::contiguous_iterator>); static_assert(!cuda::std::contiguous_iterator>); @@ -23,10 +24,12 @@ static_assert(!cuda::std::contiguous_iterator>); static_assert(!cuda::std::contiguous_iterator>); static_assert(cuda::std::contiguous_iterator>); +#ifndef TEST_COMPILER_MSVC_2017 static_assert(cuda::std::contiguous_iterator); static_assert(cuda::std::contiguous_iterator); static_assert(cuda::std::contiguous_iterator); static_assert(cuda::std::contiguous_iterator); +#endif // TEST_COMPILER_MSVC_2017 struct simple_contiguous_iterator { typedef cuda::std::contiguous_iterator_tag iterator_category; diff --git a/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.random.access/random_access_iterator.compile.pass.cpp b/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.random.access/random_access_iterator.compile.pass.cpp index b13ef014d6..3ddca1d12c 100644 --- a/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.random.access/random_access_iterator.compile.pass.cpp +++ b/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.random.access/random_access_iterator.compile.pass.cpp @@ -24,10 +24,12 @@ static_assert(!cuda::std::random_access_iterator>); static_assert( cuda::std::random_access_iterator>); static_assert( cuda::std::random_access_iterator>); +#ifndef TEST_COMPILER_MSVC_2017 static_assert(cuda::std::random_access_iterator); static_assert(cuda::std::random_access_iterator); static_assert(cuda::std::random_access_iterator); static_assert(cuda::std::random_access_iterator); +#endif // TEST_COMPILER_MSVC_2017 struct wrong_iterator_category { typedef cuda::std::bidirectional_iterator_tag iterator_category; diff --git a/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.sentinel/sentinel_for.compile.pass.cpp b/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.sentinel/sentinel_for.compile.pass.cpp index c0cc344223..38b0cc0de8 100644 --- a/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.sentinel/sentinel_for.compile.pass.cpp +++ b/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.sentinel/sentinel_for.compile.pass.cpp @@ -14,6 +14,8 @@ #include +#include "test_macros.h" + static_assert(cuda::std::sentinel_for); static_assert(!cuda::std::sentinel_for); struct nth_element_sentinel { @@ -60,9 +62,12 @@ struct move_only_iterator { __host__ __device__ bool operator==(move_only_iterator const&) const; __host__ __device__ bool operator!=(move_only_iterator const&) const; }; + +#ifndef TEST_COMPILER_MSVC_2017 static_assert(cuda::std::movable && !cuda::std::copyable && cuda::std::input_or_output_iterator && !cuda::std::sentinel_for); +#endif // TEST_COMPILER_MSVC_2017 int main(int, char**) { diff --git a/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/weakly_incrementable.compile.pass.cpp b/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/weakly_incrementable.compile.pass.cpp index 1bd9ed6253..68695c35ac 100644 --- a/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/weakly_incrementable.compile.pass.cpp +++ b/libcudacxx/.upstream-tests/test/std/iterators/iterator.requirements/iterator.concepts/iterator.concept.winc/weakly_incrementable.compile.pass.cpp @@ -66,9 +66,11 @@ static_assert(cuda::std::weakly_incrementable); static_assert(cuda::std::weakly_incrementable); static_assert(cuda::std::weakly_incrementable); static_assert(cuda::std::weakly_incrementable); +#ifndef TEST_COMPILER_MSVC_2017 static_assert(cuda::std::weakly_incrementable); static_assert(cuda::std::weakly_incrementable); static_assert(cuda::std::weakly_incrementable); +#endif // TEST_COMPILER_MSVC_2017 int main(int, char**) { diff --git a/libcudacxx/.upstream-tests/test/support/test_iterators.h b/libcudacxx/.upstream-tests/test/support/test_iterators.h index 28ae182f58..aa75112276 100644 --- a/libcudacxx/.upstream-tests/test/support/test_iterators.h +++ b/libcudacxx/.upstream-tests/test/support/test_iterators.h @@ -609,8 +609,12 @@ class cpp20_input_iterator using iterator_concept = cuda::std::input_iterator_tag; __host__ __device__ constexpr explicit cpp20_input_iterator(It it) : it_(it) {} + +#ifndef TEST_COMPILER_MSVC_2017 // MSVC2017 has issues determining common_reference cpp20_input_iterator(cpp20_input_iterator&&) = default; cpp20_input_iterator& operator=(cpp20_input_iterator&&) = default; +#endif // !TEST_COMPILER_MSVC_2017 + __host__ __device__ constexpr decltype(auto) operator*() const { return *it_; } __host__ __device__ constexpr cpp20_input_iterator& operator++() { ++it_; return *this; } __host__ __device__ constexpr void operator++(int) { ++it_; } @@ -643,8 +647,11 @@ class cpp20_output_iterator { using difference_type = cuda::std::iter_difference_t; __host__ __device__ constexpr explicit cpp20_output_iterator(It it) : it_(it) {} + +#ifndef TEST_COMPILER_MSVC_2017 // MSVC2017 has issues determining common_reference cpp20_output_iterator(cpp20_output_iterator&&) = default; cpp20_output_iterator& operator=(cpp20_output_iterator&&) = default; +#endif // !TEST_COMPILER_MSVC_2017 __host__ __device__ constexpr decltype(auto) operator*() const { return *it_; } __host__ __device__ constexpr cpp20_output_iterator& operator++() { From 5b933ac859e101e3e01ef33e09eb3a1155632d75 Mon Sep 17 00:00:00 2001 From: Michael Schellenberger Costa Date: Wed, 16 Aug 2023 14:23:08 +0200 Subject: [PATCH 4/4] [skip-tests] Do not use static constexpr variables for optional MSVC 2017 does not like them and thinks they are uninitialized at use ... --- .../cuda/std/detail/libcxx/include/optional | 138 +++++++++--------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/libcudacxx/include/cuda/std/detail/libcxx/include/optional b/libcudacxx/include/cuda/std/detail/libcxx/include/optional index 1115dd9ad6..1038937b91 100644 --- a/libcudacxx/include/cuda/std/detail/libcxx/include/optional +++ b/libcudacxx/include/cuda/std/detail/libcxx/include/optional @@ -659,6 +659,57 @@ struct __is_std_optional> : true_type { }; +// Constraits +template > +using __opt_check_constructible_from_opt = _Or< + is_constructible<_Tp, _Opt&>, + is_constructible<_Tp, _Opt const&>, + is_constructible<_Tp, _Opt&&>, + is_constructible<_Tp, _Opt const&&>, + is_convertible<_Opt&, _Tp>, + is_convertible<_Opt const&, _Tp>, + is_convertible<_Opt&&, _Tp>, + is_convertible<_Opt const&&, _Tp> +>; + +template > +using __opt_check_assignable_from_opt = _Or< + is_assignable<_Tp&, _Opt&>, + is_assignable<_Tp&, _Opt const&>, + is_assignable<_Tp&, _Opt&&>, + is_assignable<_Tp&, _Opt const&&> +>; + +template +_LIBCUDACXX_INLINE_VAR constexpr bool __opt_is_implictly_constructible = _LIBCUDACXX_TRAIT(is_constructible, _Tp, _Up) + && _LIBCUDACXX_TRAIT(is_convertible, _Up, _Tp); + +template +_LIBCUDACXX_INLINE_VAR constexpr bool __opt_is_explictly_constructible = _LIBCUDACXX_TRAIT(is_constructible, _Tp, _Up) + && !_LIBCUDACXX_TRAIT(is_convertible, _Up, _Tp); + +template +_LIBCUDACXX_INLINE_VAR constexpr bool __opt_is_constructible_from_U = !_LIBCUDACXX_TRAIT(is_same, __remove_cvref_t<_Up>, in_place_t) + && !_LIBCUDACXX_TRAIT(is_same, __remove_cvref_t<_Up>, optional<_Tp>); + +template +_LIBCUDACXX_INLINE_VAR constexpr bool __opt_is_constructible_from_opt = !_LIBCUDACXX_TRAIT(is_same, _Up, _Tp) + && !__opt_check_constructible_from_opt<_Tp, _Up>::value; + +template +_LIBCUDACXX_INLINE_VAR constexpr bool __opt_is_assignable = _LIBCUDACXX_TRAIT(is_constructible, _Tp, _Up) + && _LIBCUDACXX_TRAIT(is_assignable, _Tp&, _Up); + +template +_LIBCUDACXX_INLINE_VAR constexpr bool __opt_is_assignable_from_U = !_LIBCUDACXX_TRAIT(is_same, __remove_cvref_t<_Up>, optional<_Tp>) + && (!_LIBCUDACXX_TRAIT(is_same, __remove_cvref_t<_Up>, _Tp) + || !_LIBCUDACXX_TRAIT(is_scalar, _Tp)); + +template +_LIBCUDACXX_INLINE_VAR constexpr bool __opt_is_assignable_from_opt = !_LIBCUDACXX_TRAIT(is_same, _Up, _Tp) + && !__opt_check_constructible_from_opt<_Tp, _Up>::value + && !__opt_check_assignable_from_opt<_Tp, _Up>::value; + template class optional : private __optional_move_assign_base<_Tp> @@ -686,26 +737,6 @@ private: static_assert(!_LIBCUDACXX_TRAIT(is_array, value_type), "instantiation of optional with an array type is ill-formed"); - template > - using __check_constructible_from_opt = _Or< - is_constructible<_Tp, _Opt&>, - is_constructible<_Tp, _Opt const&>, - is_constructible<_Tp, _Opt&&>, - is_constructible<_Tp, _Opt const&&>, - is_convertible<_Opt&, _Tp>, - is_convertible<_Opt const&, _Tp>, - is_convertible<_Opt&&, _Tp>, - is_convertible<_Opt const&&, _Tp> - >; - - template > - using __check_assignable_from_opt = _Or< - is_assignable<_Tp&, _Opt&>, - is_assignable<_Tp&, _Opt const&>, - is_assignable<_Tp&, _Opt&&>, - is_assignable<_Tp&, _Opt const&&> - >; - public: _LIBCUDACXX_INLINE_VISIBILITY constexpr optional() noexcept {} @@ -726,61 +757,45 @@ public: explicit optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args) : __base(in_place, __il, _CUDA_VSTD::forward<_Args>(__args)...) {} - template - static constexpr bool __is_implictly_constructible = _LIBCUDACXX_TRAIT(is_constructible, _Tp, _Up) - && _LIBCUDACXX_TRAIT(is_convertible, _Up, _Tp); - - template - static constexpr bool __is_explictly_constructible = _LIBCUDACXX_TRAIT(is_constructible, _Tp, _Up) - && !_LIBCUDACXX_TRAIT(is_convertible, _Up, _Tp); - - template - static constexpr bool __is_constructible_from_U = !_LIBCUDACXX_TRAIT(is_same, __remove_cvref_t<_Up>, in_place_t) - && !_LIBCUDACXX_TRAIT(is_same, __remove_cvref_t<_Up>, optional); - _LIBCUDACXX_TEMPLATE(class _Up = value_type) - (requires __is_constructible_from_U<_Up> _LIBCUDACXX_AND - __is_implictly_constructible<_Up>) + (requires __opt_is_constructible_from_U<_Tp, _Up> _LIBCUDACXX_AND + __opt_is_implictly_constructible<_Tp, _Up>) _LIBCUDACXX_INLINE_VISIBILITY constexpr optional(_Up&& __v) : __base(in_place, _CUDA_VSTD::forward<_Up>(__v)) {} _LIBCUDACXX_TEMPLATE(class _Up) - (requires __is_constructible_from_U<_Up> _LIBCUDACXX_AND - __is_explictly_constructible<_Up>) + (requires __opt_is_constructible_from_U<_Tp, _Up> _LIBCUDACXX_AND + __opt_is_explictly_constructible<_Tp, _Up>) _LIBCUDACXX_INLINE_VISIBILITY constexpr explicit optional(_Up&& __v) : __base(in_place, _CUDA_VSTD::forward<_Up>(__v)) {} - template - static constexpr bool __is_constructible_from_opt = !_LIBCUDACXX_TRAIT(is_same, _Up, _Tp) - && !__check_constructible_from_opt<_Up>::value; - _LIBCUDACXX_TEMPLATE(class _Up) - (requires __is_constructible_from_opt<_Up> _LIBCUDACXX_AND - __is_implictly_constructible) + (requires __opt_is_constructible_from_opt<_Tp, _Up> _LIBCUDACXX_AND + __opt_is_implictly_constructible<_Tp, const _Up&>) _LIBCUDACXX_INLINE_VISIBILITY constexpr optional(const optional<_Up>& __v) { this->__construct_from(__v); } _LIBCUDACXX_TEMPLATE(class _Up) - (requires __is_constructible_from_opt<_Up> _LIBCUDACXX_AND - __is_explictly_constructible) + (requires __opt_is_constructible_from_opt<_Tp, _Up> _LIBCUDACXX_AND + __opt_is_explictly_constructible<_Tp, const _Up&>) _LIBCUDACXX_INLINE_VISIBILITY constexpr explicit optional(const optional<_Up>& __v) { this->__construct_from(__v); } _LIBCUDACXX_TEMPLATE(class _Up) - (requires __is_constructible_from_opt<_Up> _LIBCUDACXX_AND - __is_implictly_constructible<_Up>) + (requires __opt_is_constructible_from_opt<_Tp, _Up> _LIBCUDACXX_AND + __opt_is_implictly_constructible<_Tp, _Up>) _LIBCUDACXX_INLINE_VISIBILITY constexpr optional(optional<_Up>&& __v) { this->__construct_from(_CUDA_VSTD::move(__v)); } _LIBCUDACXX_TEMPLATE(class _Up) - (requires __is_constructible_from_opt<_Up> _LIBCUDACXX_AND - __is_explictly_constructible<_Up>) + (requires __opt_is_constructible_from_opt<_Tp, _Up> _LIBCUDACXX_AND + __opt_is_explictly_constructible<_Tp, _Up>) _LIBCUDACXX_INLINE_VISIBILITY constexpr explicit optional(optional<_Up>&& __v) { this->__construct_from(_CUDA_VSTD::move(__v)); @@ -804,19 +819,9 @@ public: constexpr optional& operator=(const optional&) = default; constexpr optional& operator=(optional&&) = default; - // Note: __is__assignable is potentially a built-in - template - static constexpr bool __is_assignable_from = _LIBCUDACXX_TRAIT(is_constructible, _Tp, _Up) - && _LIBCUDACXX_TRAIT(is_assignable, _Tp&, _Up); - - template - static constexpr bool __is_assignable_from_U = !_LIBCUDACXX_TRAIT(is_same, __remove_cvref_t<_Up>, optional) - && (!_LIBCUDACXX_TRAIT(is_same, __remove_cvref_t<_Up>, _Tp) - || !_LIBCUDACXX_TRAIT(is_scalar, _Tp)); - _LIBCUDACXX_TEMPLATE(class _Up = value_type) - (requires __is_assignable_from_U<_Up> _LIBCUDACXX_AND - __is_assignable_from<_Up>) + (requires __opt_is_assignable_from_U<_Tp, _Up> _LIBCUDACXX_AND + __opt_is_assignable<_Tp, _Up>) _LIBCUDACXX_INLINE_VISIBILITY constexpr optional& operator=(_Up&& __v) { if (this->has_value()) @@ -826,14 +831,9 @@ public: return *this; } - template - static constexpr bool __is_assignable_from_opt = !_LIBCUDACXX_TRAIT(is_same, _Up, _Tp) - && !__check_constructible_from_opt<_Up>::value - && !__check_assignable_from_opt<_Up>::value; - _LIBCUDACXX_TEMPLATE(class _Up) - (requires __is_assignable_from_opt<_Up> _LIBCUDACXX_AND - __is_assignable_from) + (requires __opt_is_assignable_from_opt<_Tp, _Up> _LIBCUDACXX_AND + __opt_is_assignable<_Tp, const _Up&>) _LIBCUDACXX_INLINE_VISIBILITY constexpr optional& operator=(const optional<_Up>& __v) { this->__assign_from(__v); @@ -841,8 +841,8 @@ public: } _LIBCUDACXX_TEMPLATE(class _Up) - (requires __is_assignable_from_opt<_Up> _LIBCUDACXX_AND - __is_assignable_from<_Up>) + (requires __opt_is_assignable_from_opt<_Tp, _Up> _LIBCUDACXX_AND + __opt_is_assignable<_Tp, _Up>) _LIBCUDACXX_INLINE_VISIBILITY constexpr optional& operator=(optional<_Up>&& __v) { this->__assign_from(_CUDA_VSTD::move(__v));