Skip to content

Commit 449721b

Browse files
authored
[SYCL] Add missed constexpr for vec (#4324)
This is missing part for #4301. Helper functions used in constructors with variadic arguments miss constexpr.
1 parent 6c137f8 commit 449721b

File tree

2 files changed

+26
-16
lines changed

2 files changed

+26
-16
lines changed

sycl/include/CL/sycl/types.hpp

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,7 +1202,8 @@ template <typename Type, int NumElements> class vec {
12021202
#ifdef __SYCL_USE_EXT_VECTOR_TYPE__
12031203
template <int Num = NumElements, typename Ty = int,
12041204
typename = typename detail::enable_if_t<1 != Num>>
1205-
void setValue(EnableIfNotHostHalf<Ty> Index, const DataT &Value, int) {
1205+
constexpr void setValue(EnableIfNotHostHalf<Ty> Index, const DataT &Value,
1206+
int) {
12061207
m_Data[Index] = Value;
12071208
}
12081209

@@ -1214,7 +1215,7 @@ template <typename Type, int NumElements> class vec {
12141215

12151216
template <int Num = NumElements, typename Ty = int,
12161217
typename = typename detail::enable_if_t<1 != Num>>
1217-
void setValue(EnableIfHostHalf<Ty> Index, const DataT &Value, int) {
1218+
constexpr void setValue(EnableIfHostHalf<Ty> Index, const DataT &Value, int) {
12181219
m_Data.s[Index] = Value;
12191220
}
12201221

@@ -1226,7 +1227,7 @@ template <typename Type, int NumElements> class vec {
12261227
#else // __SYCL_USE_EXT_VECTOR_TYPE__
12271228
template <int Num = NumElements,
12281229
typename = typename detail::enable_if_t<1 != Num>>
1229-
void setValue(int Index, const DataT &Value, int) {
1230+
constexpr void setValue(int Index, const DataT &Value, int) {
12301231
m_Data.s[Index] = Value;
12311232
}
12321233

@@ -1239,7 +1240,7 @@ template <typename Type, int NumElements> class vec {
12391240

12401241
template <int Num = NumElements,
12411242
typename = typename detail::enable_if_t<1 == Num>>
1242-
void setValue(int, const DataT &Value, float) {
1243+
constexpr void setValue(int, const DataT &Value, float) {
12431244
m_Data = Value;
12441245
}
12451246

@@ -1250,7 +1251,7 @@ template <typename Type, int NumElements> class vec {
12501251
}
12511252

12521253
// Special proxies as specialization is not allowed in class scope.
1253-
void setValue(int Index, const DataT &Value) {
1254+
constexpr void setValue(int Index, const DataT &Value) {
12541255
if (NumElements == 1)
12551256
setValue(Index, Value, 0);
12561257
else
@@ -1263,13 +1264,13 @@ template <typename Type, int NumElements> class vec {
12631264

12641265
// Helpers for variadic template constructor of vec.
12651266
template <typename T, typename... argTN>
1266-
int vaargCtorHelper(int Idx, const T &arg) {
1267+
constexpr int vaargCtorHelper(int Idx, const T &arg) {
12671268
setValue(Idx, arg);
12681269
return Idx + 1;
12691270
}
12701271

12711272
template <typename DataT_, int NumElements_>
1272-
int vaargCtorHelper(int Idx, const vec<DataT_, NumElements_> &arg) {
1273+
constexpr int vaargCtorHelper(int Idx, const vec<DataT_, NumElements_> &arg) {
12731274
for (size_t I = 0; I < NumElements_; ++I) {
12741275
setValue(Idx + I, arg.getValue(I));
12751276
}
@@ -1278,9 +1279,9 @@ template <typename Type, int NumElements> class vec {
12781279

12791280
template <typename DataT_, int NumElements_, typename T2, typename T3,
12801281
template <typename> class T4, int... T5>
1281-
int vaargCtorHelper(int Idx,
1282-
const detail::SwizzleOp<vec<DataT_, NumElements_>, T2, T3,
1283-
T4, T5...> &arg) {
1282+
constexpr int
1283+
vaargCtorHelper(int Idx, const detail::SwizzleOp<vec<DataT_, NumElements_>,
1284+
T2, T3, T4, T5...> &arg) {
12841285
size_t NumElems = sizeof...(T5);
12851286
for (size_t I = 0; I < NumElems; ++I) {
12861287
setValue(Idx + I, arg.getValue(I));
@@ -1290,9 +1291,10 @@ template <typename Type, int NumElements> class vec {
12901291

12911292
template <typename DataT_, int NumElements_, typename T2, typename T3,
12921293
template <typename> class T4, int... T5>
1293-
int vaargCtorHelper(int Idx,
1294-
const detail::SwizzleOp<const vec<DataT_, NumElements_>,
1295-
T2, T3, T4, T5...> &arg) {
1294+
constexpr int
1295+
vaargCtorHelper(int Idx,
1296+
const detail::SwizzleOp<const vec<DataT_, NumElements_>, T2,
1297+
T3, T4, T5...> &arg) {
12961298
size_t NumElems = sizeof...(T5);
12971299
for (size_t I = 0; I < NumElems; ++I) {
12981300
setValue(Idx + I, arg.getValue(I));
@@ -1301,14 +1303,15 @@ template <typename Type, int NumElements> class vec {
13011303
}
13021304

13031305
template <typename T1, typename... argTN>
1304-
void vaargCtorHelper(int Idx, const T1 &arg, const argTN &... args) {
1306+
constexpr void vaargCtorHelper(int Idx, const T1 &arg,
1307+
const argTN &... args) {
13051308
int NewIdx = vaargCtorHelper(Idx, arg);
13061309
vaargCtorHelper(NewIdx, args...);
13071310
}
13081311

13091312
template <typename DataT_, int NumElements_, typename... argTN>
1310-
void vaargCtorHelper(int Idx, const vec<DataT_, NumElements_> &arg,
1311-
const argTN &... args) {
1313+
constexpr void vaargCtorHelper(int Idx, const vec<DataT_, NumElements_> &arg,
1314+
const argTN &... args) {
13121315
int NewIdx = vaargCtorHelper(Idx, arg);
13131316
vaargCtorHelper(NewIdx, args...);
13141317
}

sycl/test/basic_tests/SYCL-2020-spec-constants.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ constexpr sycl::specialization_id<sycl::vec<double, 4>> vec_id_def(v);
4646
constexpr sycl::specialization_id<sycl::vec<double, 1>> vec_id1(11.0);
4747
constexpr sycl::specialization_id<sycl::vec<double, 4>> vec_id4(11.0);
4848

49+
constexpr sycl::vec<long long, 1> vv(1);
50+
51+
template <typename T> inline constexpr auto helper(int x) { return T{x}; }
52+
53+
constexpr sycl::specialization_id<sycl::vec<long long, 1>>
54+
vec_helper1(helper<sycl::vec<long long, 1>>(1));
55+
4956
struct composite {
5057
int a;
5158
int b;

0 commit comments

Comments
 (0)