Skip to content

Commit 47db866

Browse files
authored
avoid constraint recursion in __basic_any (#8121)
* avoid recursive constraint in `basic_any` fixes #8037 * add a regression test for #8037 * fix cuda-12.0 build
1 parent b9a6446 commit 47db866

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

libcudacxx/include/cuda/__utility/__basic_any/semiregular.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,17 +56,17 @@ _CCCL_BEGIN_NAMESPACE_CUDA
5656

5757
_CCCL_EXEC_CHECK_DISABLE
5858
template <class _Tp>
59-
_CCCL_PUBLIC_API auto __move_fn(_Tp& __src, void* __dst) noexcept
60-
-> ::cuda::std::enable_if_t<::cuda::std::movable<_Tp>, void>
59+
_CCCL_PUBLIC_API auto __move_fn(_Tp& __src, void* __dst) noexcept -> void
6160
{
61+
static_assert(::cuda::std::movable<_Tp>, "type must be movable");
6262
::new (__dst) _Tp(static_cast<_Tp&&>(__src));
6363
}
6464

6565
_CCCL_EXEC_CHECK_DISABLE
6666
template <class _Tp>
67-
[[nodiscard]] _CCCL_PUBLIC_API auto __try_move_fn(_Tp& __src, void* __dst, size_t __size, size_t __align)
68-
-> ::cuda::std::enable_if_t<::cuda::std::movable<_Tp>, bool>
67+
[[nodiscard]] _CCCL_PUBLIC_API auto __try_move_fn(_Tp& __src, void* __dst, size_t __size, size_t __align) -> bool
6968
{
69+
static_assert(::cuda::std::movable<_Tp>, "type must be movable");
7070
if (::cuda::__is_small<_Tp>(__size, __align))
7171
{
7272
::new (__dst) _Tp(static_cast<_Tp&&>(__src));
@@ -81,9 +81,9 @@ template <class _Tp>
8181

8282
_CCCL_EXEC_CHECK_DISABLE
8383
template <class _Tp>
84-
[[nodiscard]] _CCCL_PUBLIC_API auto __copy_fn(_Tp const& __src, void* __dst, size_t __size, size_t __align)
85-
-> ::cuda::std::enable_if_t<::cuda::std::copyable<_Tp>, bool>
84+
[[nodiscard]] _CCCL_PUBLIC_API auto __copy_fn(_Tp const& __src, void* __dst, size_t __size, size_t __align) -> bool
8685
{
86+
static_assert(::cuda::std::copyable<_Tp>, "type must be copyable");
8787
if (::cuda::__is_small<_Tp>(__size, __align))
8888
{
8989
::new (__dst) _Tp(__src);

libcudacxx/test/libcudacxx/cuda/memory_resource/any_resource/any_resource.cu

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,4 +329,23 @@ TEMPLATE_TEST_CASE_METHOD(test_fixture, "Empty property set", "[container][resou
329329
mr.deallocate_sync(this, this->bytes(0), this->align(0));
330330
}
331331
}
332+
333+
struct my_resource_wrapper
334+
{
335+
explicit my_resource_wrapper(cuda::mr::resource_ref<cuda::mr::device_accessible>);
336+
337+
void* allocate(cuda::stream_ref, ::cuda::std::size_t, ::cuda::std::size_t);
338+
void deallocate(cuda::stream_ref, void*, ::cuda::std::size_t, ::cuda::std::size_t) noexcept;
339+
void* allocate_sync(::cuda::std::size_t, ::cuda::std::size_t);
340+
void deallocate_sync(void*, ::cuda::std::size_t, ::cuda::std::size_t) noexcept;
341+
bool operator==(my_resource_wrapper const&) const;
342+
bool operator!=(my_resource_wrapper const&) const;
343+
friend void get_property(my_resource_wrapper const&, cuda::mr::device_accessible) noexcept {}
344+
};
345+
346+
// See https://github.com/NVIDIA/cccl/issues/8037
347+
TEST_CASE("regression test for NVIDIA/cccl#8037", "[container][resource]")
348+
{
349+
STATIC_REQUIRE(cuda::std::move_constructible<my_resource_wrapper>);
350+
}
332351
#endif // __CUDA_ARCH__

0 commit comments

Comments
 (0)