| #include <assert.h> |
| |
| struct Cube |
| { |
| int x; |
| int y; |
| int z; |
| }; |
| |
| #pragma omp declare target |
| int |
| foo (short a) |
| { |
| switch (a) |
| { |
| case 1: |
| return 11; |
| break; |
| case 33: |
| return 333; |
| break; |
| case 55: |
| return 55; |
| break; |
| default: |
| return -1; |
| } |
| } |
| |
| int |
| bar (int a) |
| { |
| int *ptr = &a; |
| |
| *ptr = 100; |
| return a + *ptr; |
| } |
| |
| struct Cube |
| baz (struct Cube c) |
| { |
| c.x = 11; |
| return c; |
| } |
| |
| #pragma omp end declare target |
| |
| #define s 100 |
| |
| int |
| main (int argc) |
| { |
| /* Test 1: argument types: char to short. */ |
| |
| int array[s]; |
| #pragma omp target map(tofrom : array[ : s]) |
| { |
| for (char i = 0; i < s; i++) |
| array[i] = foo (i); |
| } |
| |
| for (int i = 0; i < s; i++) |
| assert (array[i] == foo (i)); |
| |
| /* Test 2: argument address is taken. */ |
| int v = 2; |
| |
| #pragma omp target map(tofrom : v) |
| v = bar (v); |
| |
| assert (v == 200); |
| |
| /* Test 3: passing a structure as a function argument. */ |
| struct Cube r; |
| struct Cube c = {.x = 1, .y = 2, .z = 3}; |
| |
| #pragma omp target map(to : r) map(from : c) |
| r = baz (c); |
| |
| assert (r.x == 11); |
| assert (r.y == c.y); |
| assert (r.z == c.z); |
| } |