/* std::initializer_list in target region. */ #include #include "target-flex-common.h" struct S0 { int _v; S0(std::initializer_list il) : _v(0) { for (auto const& e : il) _v += e; } }; struct S1 { int _v; template S1(std::initializer_list il) : _v(0) { for (auto const& e : il) _v += e; } }; template struct S2 { T _v; S2(std::initializer_list il) : _v(0) { for (auto const& e : il) _v += e; } }; #if __cplusplus >= 201703L template S2(std::initializer_list) -> S2; #endif bool test_initializer_list(int arg) { bool ok; #pragma omp target map(from: ok) map(to: arg) { bool inner_ok = true; { static constexpr int partial_sum = 0 + 1 + 2 + 3 + 4 + 5; S0 s0{0, 1, 2, 3, 4, 5, arg}; VERIFY (s0._v == partial_sum + arg); S1 s1{0, 1, 2, 3, 4, 5, arg}; VERIFY (s1._v == partial_sum + arg); S2 s2{0, 1, 2, 3, 4, 5, arg}; VERIFY (s2._v == partial_sum + arg); #if __cplusplus >= 201703L S2 s2_ctad{0, 1, 2, 3, 4, 5, arg}; VERIFY (s2_ctad._v == partial_sum + arg); #endif } end: ok = inner_ok; } return ok; } int main() { volatile int arg = 42; return test_initializer_list(arg) ? 0 : 1; }