@@ -40,6 +40,8 @@ namespace sycl {
4040inline namespace _V1 {
4141namespace ext ::oneapi::experimental {
4242
43+ template <typename T, typename PropertyListT> class device_global ;
44+
4345namespace detail {
4446// Type-trait for checking if a type defines `operator->`.
4547template <typename T, typename = void >
@@ -49,10 +51,19 @@ struct HasArrowOperator<T,
4951 std::void_t <decltype (std::declval<T>().operator ->())>>
5052 : std::true_type {};
5153
54+ template <typename T, typename PropertyListT, typename >
55+ class device_global_base ;
56+
5257// Checks that T is a reference to either device_global or
5358// device_global_base. This is used by the variadic ctor to allow copy ctors to
5459// take preference.
5560template <typename T> struct IsDeviceGlobalOrBaseRef : std::false_type {};
61+ template <typename T, typename PropertyListT>
62+ struct IsDeviceGlobalOrBaseRef <device_global_base<T, PropertyListT, void > &>
63+ : std::true_type {};
64+ template <typename T, typename PropertyListT>
65+ struct IsDeviceGlobalOrBaseRef <device_global<T, PropertyListT> &>
66+ : std::true_type {};
5667
5768// Base class for device_global.
5869template <typename T, typename PropertyListT, typename = void >
@@ -179,10 +190,6 @@ class device_global_base<
179190 }
180191};
181192
182- template <typename T, typename PropertyListT>
183- struct IsDeviceGlobalOrBaseRef <const device_global_base<T, PropertyListT> &>
184- : std::true_type {};
185-
186193} // namespace detail
187194
188195template <typename T, typename PropertyListT = empty_properties_t >
@@ -305,12 +312,6 @@ class
305312 }
306313};
307314
308- namespace detail {
309- template <typename T, typename PropertyListT>
310- struct IsDeviceGlobalOrBaseRef <device_global<T, PropertyListT> &>
311- : std::true_type {};
312- } // namespace detail
313-
314315} // namespace ext::oneapi::experimental
315316} // namespace _V1
316317} // namespace sycl
0 commit comments