1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
diff --git a/include/__iterator/reverse_iterator.h b/include/__iterator/reverse_iterator.h
index beb10f7..c1241da 100644
--- a/include/__iterator/reverse_iterator.h
+++ b/include/__iterator/reverse_iterator.h
@@ -144,7 +144,7 @@ public:
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX17
reference operator*() const {_Iter __tmp = current; return *--__tmp;}
-#if _LIBCPP_STD_VER >= 20
+#if (_LIBCPP_STD_VER >= 20) && !defined(__CUDACC__)
_LIBCPP_INLINE_VISIBILITY
constexpr pointer operator->() const
requires is_pointer_v<_Iter> || requires(const _Iter __i) { __i.operator->(); }
diff --git a/include/__iterator/segmented_iterator.h b/include/__iterator/segmented_iterator.h
index f3cd1e5..c0a77ef 100644
--- a/include/__iterator/segmented_iterator.h
+++ b/include/__iterator/segmented_iterator.h
@@ -68,8 +68,10 @@ struct __segmented_iterator_traits;
template <class _Tp, size_t = 0>
struct __has_specialization : false_type {};
+#ifndef __CUDACC__
template <class _Tp>
struct __has_specialization<_Tp, sizeof(_Tp) * 0> : true_type {};
+#endif
template <class _Iterator>
using __is_segmented_iterator = __has_specialization<__segmented_iterator_traits<_Iterator> >;
diff --git a/include/__math/traits.h b/include/__math/traits.h
index da585af..bc68e78 100644
--- a/include/__math/traits.h
+++ b/include/__math/traits.h
@@ -67,7 +67,7 @@ _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool i
return false;
}
-#ifdef _LIBCPP_PREFERRED_OVERLOAD
+#ifdef _LIBCPP_PREFERRED_OVERLOAD && !defined(__CUDACC__)
_LIBCPP_NODISCARD_EXT inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isinf(float __x) _NOEXCEPT {
return __builtin_isinf(__x);
}
@@ -94,7 +94,7 @@ _LIBCPP_NODISCARD_EXT _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool i
return false;
}
-#ifdef _LIBCPP_PREFERRED_OVERLOAD
+#ifdef _LIBCPP_PREFERRED_OVERLOAD && !defined(__CUDACC__)
_LIBCPP_NODISCARD_EXT inline _LIBCPP_CONSTEXPR_SINCE_CXX23 _LIBCPP_HIDE_FROM_ABI bool isnan(float __x) _NOEXCEPT {
return __builtin_isnan(__x);
}
diff --git a/include/complex b/include/complex
index c8ffde9..7f44242 100644
--- a/include/complex
+++ b/include/complex
@@ -1526,7 +1526,7 @@ inline namespace literals
return { 0.0, static_cast<double>(__im) };
}
-
+#if !defined(__CUDACC__)
_LIBCPP_HIDE_FROM_ABI constexpr complex<float> operator""if(long double __im)
{
return { 0.0f, static_cast<float>(__im) };
@@ -1536,6 +1536,7 @@ inline namespace literals
{
return { 0.0f, static_cast<float>(__im) };
}
+#endif
} // namespace complex_literals
} // namespace literals
#endif
diff --git a/include/tuple b/include/tuple
index 138c132..63adb8e 100644
--- a/include/tuple
+++ b/include/tuple
@@ -308,7 +308,7 @@ class __tuple_leaf
template <class _Tp>
static _LIBCPP_HIDE_FROM_ABI constexpr bool __can_bind_reference() {
-#if __has_keyword(__reference_binds_to_temporary)
+#if __has_keyword(__reference_binds_to_temporary) && !defined(__CUDACC__)
return !__reference_binds_to_temporary(_Hp, _Tp);
#else
return true;
@@ -670,6 +670,12 @@ _LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wc++20-extensions")
_And<
_BoolConstant<sizeof...(_Up) == sizeof...(_Tp)>,
_EnableUTypesCtor<_Up...>
+// nvcc 12.2 cannot choose between tuple(const T& ... t) and tuple(U&&... u)
+// so we have to added an explicit requires in enable_if
+#ifdef __CUDACC__
+ ,
+ _Not<_And<is_copy_constructible<_Tp>..., _Lazy<_And, is_convertible<_Up, const _Tp&>...>> >
+#endif
>::value
, int> = 0>
_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_SINCE_CXX14
|