Skip to content

Commit 70e7703

Browse files
authored
Fix libcu++ compilation with clang-20 (#5799)
1 parent e6c6778 commit 70e7703

File tree

5 files changed

+44
-25
lines changed

5 files changed

+44
-25
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ _CCCL_BEGIN_NAMESPACE_CUDA
5050
//! Note: a `__basic_any<__ireference<_Interface>> &&` is an rvalue reference,
5151
//! whereas a `__basic_any<_Interface &> &&` is an lvalue reference.
5252
template <class _Interface>
53-
struct __ireference : _Interface
53+
struct __ireference : ::cuda::std::remove_const_t<_Interface>
5454
{
5555
static_assert(::cuda::std::is_class_v<_Interface>, "expected a class type");
5656
static constexpr size_t __size_ = sizeof(void*);

libcudacxx/include/cuda/std/detail/libcxx/include/tuple

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ template <class... Types>
171171
#include <cuda/std/__type_traits/copy_cvref.h>
172172
#include <cuda/std/__type_traits/maybe_const.h>
173173
#include <cuda/std/__type_traits/reference_constructs_from_temporary.h>
174+
#include <cuda/std/__type_traits/remove_const.h>
174175
#include <cuda/std/__utility/forward.h>
175176
#include <cuda/std/__utility/integer_sequence.h>
176177
#include <cuda/std/__utility/move.h>
@@ -414,7 +415,7 @@ public:
414415
};
415416

416417
template <size_t _Ip, class _Hp>
417-
class __tuple_leaf<_Ip, _Hp, __tuple_leaf_specialization::__empty_non_final> : private _Hp
418+
class __tuple_leaf<_Ip, _Hp, __tuple_leaf_specialization::__empty_non_final> : private remove_const_t<_Hp>
418419
{
419420
public:
420421
_CCCL_EXEC_CHECK_DISABLE

libcudacxx/test/libcudacxx/std/strings/string.view/string.view.cons/from_range.pass.cpp

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,17 @@
2828
template <class CharT>
2929
struct TestBase
3030
{
31-
__host__ __device__ static constexpr const CharT* range_data()
31+
__host__ __device__ constexpr const CharT* range_data() const
3232
{
33-
return TEST_STRLIT(CharT, "range_data");
33+
return range_data_;
3434
}
35-
__host__ __device__ static constexpr cuda::std::size_t range_size()
35+
__host__ __device__ constexpr cuda::std::size_t range_size() const
3636
{
3737
return cuda::std::char_traits<CharT>::length(range_data());
3838
}
39-
__host__ __device__ static constexpr const CharT* conv_data()
39+
__host__ __device__ constexpr const CharT* conv_data() const
4040
{
41-
return TEST_STRLIT(CharT, "conv_data");
41+
return conv_data_;
4242
}
4343

4444
__host__ __device__ constexpr const CharT* begin() const
@@ -49,6 +49,9 @@ struct TestBase
4949
{
5050
return range_data() + range_size();
5151
}
52+
53+
const CharT* range_data_;
54+
const CharT* conv_data_;
5255
};
5356

5457
template <class CharT>
@@ -57,6 +60,9 @@ __host__ __device__ constexpr void test_from_range()
5760
using SV = cuda::std::basic_string_view<CharT>;
5861
using TB = TestBase<CharT>;
5962

63+
const auto range_data = TEST_STRLIT(CharT, "range_data");
64+
const auto conv_data = TEST_STRLIT(CharT, "conv_data");
65+
6066
// 1. test construction from cuda::std::array
6167
{
6268
cuda::std::array<CharT, 3> arr{TEST_CHARLIT(CharT, 'f'), TEST_CHARLIT(CharT, 'o'), TEST_CHARLIT(CharT, 'o')};
@@ -80,9 +86,9 @@ __host__ __device__ constexpr void test_from_range()
8086
static_assert(cuda::std::is_constructible_v<SV, NonConstConversionOperator>);
8187
static_assert(!cuda::std::is_convertible_v<const NonConstConversionOperator&, SV>);
8288

83-
NonConstConversionOperator nc{};
89+
NonConstConversionOperator nc{range_data, conv_data};
8490
SV sv = nc;
85-
assert(sv == TB::conv_data());
91+
assert(sv == nc.conv_data());
8692
}
8793

8894
// 3. test construction from a type with a const conversion operator
@@ -99,14 +105,14 @@ __host__ __device__ constexpr void test_from_range()
99105
static_assert(cuda::std::is_constructible_v<SV, const ConstConversionOperator&>);
100106

101107
{
102-
ConstConversionOperator cv{};
108+
ConstConversionOperator cv{range_data, conv_data};
103109
SV sv = cv;
104-
assert(sv == TB::conv_data());
110+
assert(sv == cv.conv_data());
105111
}
106112
{
107-
const ConstConversionOperator cv{};
113+
const ConstConversionOperator cv{range_data, conv_data};
108114
SV sv = cv;
109-
assert(sv == TB::conv_data());
115+
assert(sv == cv.conv_data());
110116
}
111117
}
112118

@@ -125,14 +131,14 @@ __host__ __device__ constexpr void test_from_range()
125131
static_assert(cuda::std::is_constructible_v<SV, const DeletedConversionOperator>);
126132

127133
{
128-
DeletedConversionOperator cv{};
134+
DeletedConversionOperator cv{range_data, conv_data};
129135
SV sv = SV(cv);
130-
assert(sv == TB::range_data());
136+
assert(sv == cv.range_data());
131137
}
132138
{
133-
const DeletedConversionOperator cv{};
139+
const DeletedConversionOperator cv{range_data, conv_data};
134140
SV sv = SV(cv);
135-
assert(sv == TB::range_data());
141+
assert(sv == cv.range_data());
136142
}
137143
}
138144

@@ -151,14 +157,14 @@ __host__ __device__ constexpr void test_from_range()
151157
static_assert(cuda::std::is_constructible_v<SV, const DeletedConstConversionOperator>);
152158

153159
{
154-
DeletedConstConversionOperator cv{};
160+
DeletedConstConversionOperator cv{range_data, conv_data};
155161
SV sv = SV(cv);
156-
assert(sv == TB::range_data());
162+
assert(sv == cv.range_data());
157163
}
158164
{
159-
const DeletedConstConversionOperator cv{};
165+
const DeletedConstConversionOperator cv{range_data, conv_data};
160166
SV sv = SV(cv);
161-
assert(sv == TB::range_data());
167+
assert(sv == cv.range_data());
162168
}
163169
}
164170

libcudacxx/test/libcudacxx/std/strings/string.view/string.view.deduct/range.pass.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ __host__ __device__ constexpr void test_range_deduct()
3838
{
3939
struct Widget
4040
{
41-
__host__ __device__ static constexpr const CharT* data()
41+
__host__ __device__ constexpr const CharT* data() const
4242
{
43-
return TEST_STRLIT(CharT, "foo");
43+
return data_;
4444
}
4545
__host__ __device__ constexpr contiguous_iterator<const CharT*> begin() const
4646
{
@@ -50,11 +50,14 @@ __host__ __device__ constexpr void test_range_deduct()
5050
{
5151
return contiguous_iterator<const CharT*>(data() + 3);
5252
}
53+
54+
const CharT* data_;
5355
};
54-
cuda::std::basic_string_view bsv = cuda::std::basic_string_view(Widget());
56+
const auto widget_data = TEST_STRLIT(CharT, "foo");
57+
cuda::std::basic_string_view bsv = cuda::std::basic_string_view(Widget{widget_data});
5558
static_assert(cuda::std::is_same_v<decltype(bsv), cuda::std::basic_string_view<CharT>>);
5659
assert(bsv.size() == 3);
57-
assert(bsv.data() == Widget::data());
60+
assert(bsv.data() == widget_data);
5861
}
5962
}
6063

libcudacxx/test/support/literal.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,13 @@ _test_int_literal_impl(const char (&cs)[N]) noexcept
241241
namespace test_integer_literals
242242
{
243243

244+
// nvcc passes operator""_x to the host compiler as operator "" _x, which was deprecated in CWG 2521 (nvbug 5507437)
245+
// clang 20 already warns about this, so we need to suppress the warning here
246+
_CCCL_DIAG_PUSH
247+
#if _CCCL_COMPILER(CLANG, >=, 20)
248+
_CCCL_DIAG_SUPPRESS_CLANG("-Wdeprecated-literal-operator")
249+
#endif // _CCCL_COMPILER(CLANG, >=, 20)
250+
244251
#if _CCCL_HAS_INT128()
245252
template <char... Cs>
246253
[[nodiscard]] __host__ __device__ constexpr __int128_t operator""_i128() noexcept
@@ -263,6 +270,8 @@ template <char... Cs>
263270
}
264271
#endif // _CCCL_HAS_INT128()
265272

273+
_CCCL_DIAG_POP
274+
266275
} // namespace test_integer_literals
267276

268277
#endif // TEST_SUPPORT_LITERAL_H

0 commit comments

Comments
 (0)