From 960288a44842eccb58b45fef50fca7975afa1262 Mon Sep 17 00:00:00 2001 From: Robertkq Date: Thu, 6 Aug 2026 15:39:50 +0300 Subject: [PATCH 1/4] Add missing functions & noexcept keyword --- sycl/include/sycl/range.hpp | 56 ++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 19 deletions(-) diff --git a/sycl/include/sycl/range.hpp b/sycl/include/sycl/range.hpp index cb1abe36e1f03..9fe1319ec10e7 100644 --- a/sycl/include/sycl/range.hpp +++ b/sycl/include/sycl/range.hpp @@ -39,22 +39,23 @@ template class range : public detail::array { /* The following constructor is only available in the range class specialization where: Dimensions==1 */ template - range(typename std::enable_if_t<(N == 1), size_t> dim0) : base(dim0) {} + range(typename std::enable_if_t<(N == 1), size_t> dim0) noexcept + : base(dim0) {} /* The following constructor is only available in the range class specialization where: Dimensions==2 */ template - range(typename std::enable_if_t<(N == 2), size_t> dim0, size_t dim1) + range(typename std::enable_if_t<(N == 2), size_t> dim0, size_t dim1) noexcept : base(dim0, dim1) {} /* The following constructor is only available in the range class specialization where: Dimensions==3 */ template range(typename std::enable_if_t<(N == 3), size_t> dim0, size_t dim1, - size_t dim2) + size_t dim2) noexcept : base(dim0, dim1, dim2) {} - size_t size() const { + size_t size() const noexcept { size_t size = 1; for (int i = 0; i < Dimensions; ++i) { size *= this->common_array[i]; @@ -63,15 +64,17 @@ template class range : public detail::array { } range(const range &rhs) = default; - range(range &&rhs) = default; + range(range &&rhs) noexcept = default; range &operator=(const range &rhs) = default; - range &operator=(range &&rhs) = default; - range() = default; + range &operator=(range &&rhs) noexcept = default; + range() noexcept = default; + + ~range() noexcept = default; // OP is: +, -, *, /, %, <<, >>, &, |, ^, &&, ||, <, >, <=, >= #define __SYCL_GEN_OPT_BASE(op) \ - friend range operator op(const range &lhs, \ - const range &rhs) { \ + friend range operator op( \ + const range &lhs, const range &rhs) noexcept { \ range result(lhs); \ for (int i = 0; i < Dimensions; ++i) { \ result.common_array[i] = lhs.common_array[i] op rhs.common_array[i]; \ @@ -85,7 +88,7 @@ template class range : public detail::array { __SYCL_GEN_OPT_BASE(op) \ template \ friend IntegralType> operator op( \ - const range &lhs, const T &rhs) { \ + const range &lhs, const T &rhs) noexcept { \ range result(lhs); \ for (int i = 0; i < Dimensions; ++i) { \ result.common_array[i] = lhs.common_array[i] op rhs; \ @@ -94,7 +97,7 @@ template class range : public detail::array { } \ template \ friend IntegralType> operator op( \ - const T &lhs, const range &rhs) { \ + const T &lhs, const range &rhs) noexcept { \ range result(rhs); \ for (int i = 0; i < Dimensions; ++i) { \ result.common_array[i] = lhs op rhs.common_array[i]; \ @@ -102,6 +105,9 @@ template class range : public detail::array { return result; \ } #else + +// Can't find either of them in documentation, not adding noexcept for these, +// maybe need to be removed #define __SYCL_GEN_OPT(op) \ __SYCL_GEN_OPT_BASE(op) \ friend range operator op(const range &lhs, \ @@ -144,8 +150,8 @@ template class range : public detail::array { // OP is: +=, -=, *=, /=, %=, <<=, >>=, &=, |=, ^= #define __SYCL_GEN_OPT(op) \ - friend range &operator op(range &lhs, \ - const range &rhs) { \ + friend range &operator op( \ + range &lhs, const range &rhs) noexcept { \ for (int i = 0; i < Dimensions; ++i) { \ lhs.common_array[i] op rhs[i]; \ } \ @@ -157,8 +163,19 @@ template class range : public detail::array { lhs.common_array[i] op rhs; \ } \ return lhs; \ + } \ + template \ + friend IntegralType> operator op( \ + range &lhs, const T &rhs) noexcept { \ + for (int i = 0; i < Dimensions; ++i) { \ + lhs.common_array[i] op rhs; \ + } \ + return lhs; \ } + // second overload above is not in documentation, maybe need to be removed or + // guarded against __SYCL_DISABLE_ID_TO_INT_CONV__ like the other operators + __SYCL_GEN_OPT(+=) __SYCL_GEN_OPT(-=) __SYCL_GEN_OPT(*=) @@ -174,7 +191,8 @@ template class range : public detail::array { // OP is unary +, - #define __SYCL_GEN_OPT(op) \ - friend range operator op(const range &rhs) { \ + friend range operator op( \ + const range &rhs) noexcept { \ range result(rhs); \ for (int i = 0; i < Dimensions; ++i) { \ result.common_array[i] = (op rhs.common_array[i]); \ @@ -189,7 +207,7 @@ template class range : public detail::array { // OP is prefix ++, -- #define __SYCL_GEN_OPT(op) \ - friend range &operator op(range &rhs) { \ + friend range &operator op(range &rhs) noexcept { \ for (int i = 0; i < Dimensions; ++i) { \ op rhs.common_array[i]; \ } \ @@ -203,7 +221,7 @@ template class range : public detail::array { // OP is postfix ++, -- #define __SYCL_GEN_OPT(op) \ - friend range operator op(range &lhs, int) { \ + friend range operator op(range &lhs, int) noexcept { \ range old_lhs(lhs); \ for (int i = 0; i < Dimensions; ++i) { \ op lhs.common_array[i]; \ @@ -225,9 +243,9 @@ template class range : public detail::array { }; #ifdef __cpp_deduction_guides -range(size_t)->range<1>; -range(size_t, size_t)->range<2>; -range(size_t, size_t, size_t)->range<3>; +range(size_t) -> range<1>; +range(size_t, size_t) -> range<2>; +range(size_t, size_t, size_t) -> range<3>; #endif } // namespace _V1 From d58b20aea6ee959ce768911bb34f761d5c7468d5 Mon Sep 17 00:00:00 2001 From: Robertkq Date: Thu, 6 Aug 2026 16:06:43 +0300 Subject: [PATCH 2/4] remove comments --- sycl/include/sycl/range.hpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/sycl/include/sycl/range.hpp b/sycl/include/sycl/range.hpp index 9fe1319ec10e7..830391edcb1af 100644 --- a/sycl/include/sycl/range.hpp +++ b/sycl/include/sycl/range.hpp @@ -106,8 +106,6 @@ template class range : public detail::array { } #else -// Can't find either of them in documentation, not adding noexcept for these, -// maybe need to be removed #define __SYCL_GEN_OPT(op) \ __SYCL_GEN_OPT_BASE(op) \ friend range operator op(const range &lhs, \ @@ -173,9 +171,6 @@ template class range : public detail::array { return lhs; \ } - // second overload above is not in documentation, maybe need to be removed or - // guarded against __SYCL_DISABLE_ID_TO_INT_CONV__ like the other operators - __SYCL_GEN_OPT(+=) __SYCL_GEN_OPT(-=) __SYCL_GEN_OPT(*=) From ea37b637b7ffcd53b72c2183e4d6d86d66248db0 Mon Sep 17 00:00:00 2001 From: Robertkq Date: Thu, 6 Aug 2026 16:10:39 +0300 Subject: [PATCH 3/4] add noexcept to detail::array --- sycl/include/sycl/detail/array.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sycl/include/sycl/detail/array.hpp b/sycl/include/sycl/detail/array.hpp index 2b723a2ebf73e..be6ba7a73d37b 100644 --- a/sycl/include/sycl/detail/array.hpp +++ b/sycl/include/sycl/detail/array.hpp @@ -61,17 +61,17 @@ template class array { return result; } - size_t get(int dimension) const { + size_t get(int dimension) const noexcept { check_dimension(dimension); return common_array[dimension]; } - size_t &operator[](int dimension) { + size_t &operator[](int dimension) noexcept { check_dimension(dimension); return common_array[dimension]; } - size_t operator[](int dimension) const { + size_t operator[](int dimension) const noexcept { check_dimension(dimension); return common_array[dimension]; } From c7f8336c09e1483fdd1dc31fc2c4484656e1e79c Mon Sep 17 00:00:00 2001 From: Robertkq Date: Wed, 12 Aug 2026 23:37:24 +0300 Subject: [PATCH 4/4] remove undocumented unguarded feature & some unnecessary noexcepts, added RFC --- sycl/include/sycl/range.hpp | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/sycl/include/sycl/range.hpp b/sycl/include/sycl/range.hpp index 830391edcb1af..15c8d1d3836aa 100644 --- a/sycl/include/sycl/range.hpp +++ b/sycl/include/sycl/range.hpp @@ -64,12 +64,12 @@ template class range : public detail::array { } range(const range &rhs) = default; - range(range &&rhs) noexcept = default; + range(range &&rhs) = default; range &operator=(const range &rhs) = default; - range &operator=(range &&rhs) noexcept = default; - range() noexcept = default; + range &operator=(range &&rhs) = default; + range() = default; - ~range() noexcept = default; + ~range() = default; // OP is: +, -, *, /, %, <<, >>, &, |, ^, &&, ||, <, >, <=, >= #define __SYCL_GEN_OPT_BASE(op) \ @@ -105,7 +105,7 @@ template class range : public detail::array { return result; \ } #else - +// RFC: remove these as well? #define __SYCL_GEN_OPT(op) \ __SYCL_GEN_OPT_BASE(op) \ friend range operator op(const range &lhs, \ @@ -155,13 +155,6 @@ template class range : public detail::array { } \ return lhs; \ } \ - friend range &operator op(range &lhs, \ - const size_t &rhs) { \ - for (int i = 0; i < Dimensions; ++i) { \ - lhs.common_array[i] op rhs; \ - } \ - return lhs; \ - } \ template \ friend IntegralType> operator op( \ range &lhs, const T &rhs) noexcept { \