1 #include <assert.h> 2 3 struct Cube 4 { 5 int x; 6 int y; 7 int z; 8 }; 9 10 #pragma omp declare target 11 int foo(short a)12foo (short a) 13 { 14 switch (a) 15 { 16 case 1: 17 return 11; 18 break; 19 case 33: 20 return 333; 21 break; 22 case 55: 23 return 55; 24 break; 25 default: 26 return -1; 27 } 28 } 29 30 int bar(int a)31bar (int a) 32 { 33 int *ptr = &a; 34 35 *ptr = 100; 36 return a + *ptr; 37 } 38 39 struct Cube baz(struct Cube c)40baz (struct Cube c) 41 { 42 c.x = 11; 43 return c; 44 } 45 46 #pragma omp end declare target 47 48 #define s 100 49 50 int main(int argc)51main (int argc) 52 { 53 /* Test 1: argument types: char to short. */ 54 55 int array[s]; 56 #pragma omp target map(tofrom : array[ : s]) 57 { 58 for (char i = 0; i < s; i++) 59 array[i] = foo (i); 60 } 61 62 for (int i = 0; i < s; i++) 63 assert (array[i] == foo (i)); 64 65 /* Test 2: argument address is taken. */ 66 int v = 2; 67 68 #pragma omp target map(tofrom : v) 69 v = bar (v); 70 71 assert (v == 200); 72 73 /* Test 3: passing a structure as a function argument. */ 74 struct Cube r; 75 struct Cube c = {.x = 1, .y = 2, .z = 3}; 76 77 #pragma omp target map(to : r) map(from : c) 78 r = baz (c); 79 80 assert (r.x == 11); 81 assert (r.y == c.y); 82 assert (r.z == c.z); 83 } 84