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)12 foo (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)31 bar (int a)
32 {
33   int *ptr = &a;
34 
35   *ptr = 100;
36   return a + *ptr;
37 }
38 
39 struct Cube
baz(struct Cube c)40 baz (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)51 main (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