| // { dg-do run } | |
| #include <cassert> | |
| struct S | |
| { | |
| int *myarr; | |
| int len; | |
| }; | |
| template<typename T> | |
| class C | |
| { | |
| T memb; | |
| #pragma omp declare mapper (T t) map(to:t.len, t.myarr) \ | |
| map(tofrom:t.myarr[0:t.len]) | |
| public: | |
| C(int sz); | |
| ~C(); | |
| void bump(); | |
| void check(); | |
| }; | |
| template<typename T> | |
| C<T>::C(int sz) | |
| { | |
| memb.myarr = new int[sz]; | |
| for (int i = 0; i < sz; i++) | |
| memb.myarr[i] = 0; | |
| memb.len = sz; | |
| } | |
| template<typename T> | |
| C<T>::~C() | |
| { | |
| delete[] memb.myarr; | |
| } | |
| template<typename T> | |
| void C<T>::bump() | |
| { | |
| #pragma omp target map(memb) | |
| for (int i = 0; i < memb.len; i++) | |
| memb.myarr[i]++; | |
| } | |
| template<typename T> | |
| void C<T>::check() | |
| { | |
| for (int i = 0; i < memb.len; i++) | |
| assert (memb.myarr[i] == 1); | |
| } | |
| int main(int argc, char *argv[]) | |
| { | |
| C<S> c_int(100); | |
| c_int.bump(); | |
| c_int.check(); | |
| return 0; | |
| } |