#include #include static int lo() { return 30; } static int len() { return 10; } template void foo () { T arr[100]; T *ptr; memset (arr, '\0', sizeof arr); #pragma omp target enter data map(to: arr[0:100]) for (int i = 0; i < 100; i++) arr[i] = i; ptr = &arr[10]; #pragma omp target update to(*ptr) for (int i = lo (); i < lo () + len (); i++) arr[i] = i * 2; #pragma omp target update to(arr[lo():len()]) #pragma omp target exit data map(from: arr[0:100]) assert (arr[10] == 10); for (int i = lo (); i < lo () + len (); i++) assert (arr[i] == i * 2); } int main () { char arr[100]; char *ptr; memset (arr, '\0', sizeof arr); #pragma omp target enter data map(to: arr[0:100]) for (int i = 0; i < 100; i++) arr[i] = i; ptr = &arr[10]; #pragma omp target update to(*ptr) for (int i = lo (); i < lo () + len (); i++) arr[i] = i * 2; #pragma omp target update to(arr[lo():len()]) #pragma omp target exit data map(from: arr[0:100]) assert (arr[10] == 10); for (int i = lo (); i < lo () + len (); i++) assert (arr[i] == i * 2); foo (); return 0; }