dwarf2out: Fix ICE on large _BitInt in loc_list_from_tree_1 [PR113637]
[official-gcc.git] / libgomp / testsuite / libgomp.c++ / target-lambda-1.C
blobfa882d09800f21aa48330fcd20c9e399597700a2
1 // { dg-do run { target offload_device_nonshared_as } }
3 #include <cstdlib>
4 #include <cstring>
5 #include <cstdint>
7 template <typename L>
8 void
9 omp_target_loop (int begin, int end, L loop)
11   #pragma omp target teams distribute parallel for
12   for (int i = begin; i < end; i++)
13     loop (i);
16 struct S
18   int a, len;
19   int *ptr;
21   auto merge_data_func (int *iptr, int &b)
22   {
23     auto fn = [=](void) -> bool
24       {
25         bool mapped;
26         uintptr_t hostptr = (uintptr_t) ptr;
27         uintptr_t hostiptr = (uintptr_t) iptr;
28         #pragma omp target map(from:mapped)
29         {
30           mapped = (ptr != (int*) hostptr && iptr != (int*) hostiptr);
31           if (mapped)
32             {
33               for (int i = 0; i < len; i++)
34                 ptr[i] += a + b + iptr[i];
35             }
36         }
37         return mapped;
38       };
39     return fn;
40   }
43 int x = 1;
45 int main (void)
47   const int N = 10;
48   int *data1 = new int[N];
49   int *data2 = new int[N];
50   memset (data1, 0xab, sizeof (int) * N);
51   memset (data1, 0xcd, sizeof (int) * N);
53   int val = 1;
54   int &valref = val;
55   #pragma omp target enter data map(alloc: data1[:N], data2[:N])
57   omp_target_loop (0, N, [=](int i) { data1[i] = val; });
58   omp_target_loop (0, N, [=](int i) { data2[i] = valref + 1; });
60   #pragma omp target update from(data1[:N], data2[:N])
62   for (int i = 0; i < N; i++)
63     {
64       if (data1[i] != 1) abort ();
65       if (data2[i] != 2) abort ();
66     }
68   #pragma omp target exit data map(delete: data1[:N], data2[:N])
70   int b = 8;
71   S s = { 4, N, data1 };
72   auto f = s.merge_data_func (data2, b);
74   if (f ()) abort ();
76   #pragma omp target enter data map(to: data1[:N])
77   if (f ()) abort ();
79   #pragma omp target enter data map(to: data2[:N])
80   if (!f ()) abort ();
82   #pragma omp target exit data map(from: data1[:N], data2[:N])
84   for (int i = 0; i < N; i++)
85     {
86       if (data1[i] != 0xf) abort ();
87       if (data2[i] != 2) abort ();
88     }
90   return 0;