mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			111 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
| extern "C" void abort ();
 | |
| int x;
 | |
| 
 | |
| __attribute__((noinline, noclone)) void
 | |
| foo (int &a, int (&b)[10], short &c, long (&d)[5], int n)
 | |
| {
 | |
|   int err;
 | |
|   int &t = x;
 | |
|   int y[n + 1];
 | |
|   int (&z)[n + 1] = y;
 | |
|   for (int i = 0; i < n + 1; i++)
 | |
|     z[i] = i + 27;
 | |
|   #pragma omp target enter data map (to: z, c) map (alloc: b, t)
 | |
|   #pragma omp target update to (b, t)
 | |
|   #pragma omp target map (tofrom: a, d) map (from: b, c) map (alloc: t, z) map (from: err)
 | |
|   {
 | |
|     err = a++ != 7;
 | |
|     for (int i = 0; i < 10; i++)
 | |
|       {
 | |
| 	err |= b[i] != 10 - i;
 | |
| 	b[i] = i - 16;
 | |
| 	if (i >= 6) continue;
 | |
| 	err |= z[i] != i + 27;
 | |
| 	z[i] = 2 * i + 9;
 | |
| 	if (i == 5) continue;
 | |
| 	err |= d[i] != 12L + i;
 | |
| 	d[i] = i + 7;
 | |
|       }
 | |
|     err |= c != 25;
 | |
|     c = 142;
 | |
|     err |= t != 8;
 | |
|     t = 19;
 | |
|   }
 | |
|   if (err) abort ();
 | |
|   #pragma omp target update from (z, c)
 | |
|   #pragma omp target exit data map (from: b, t) map (release: z, c)
 | |
|   if (a != 8 || c != 142 || t != 19)
 | |
|     abort ();
 | |
|   a = 29;
 | |
|   c = 149;
 | |
|   t = 15;
 | |
|   for (int i = 0; i < 10; i++)
 | |
|     {
 | |
|       if (b[i] != i - 16) abort ();
 | |
|       b[i] = i ^ 1;
 | |
|       if (i >= 6) continue;
 | |
|       if (z[i] != 2 * i + 9) abort ();
 | |
|       z[i]++;
 | |
|       if (i == 5) continue;
 | |
|       if (d[i] != i + 7) abort ();
 | |
|       d[i] = 7 - i;
 | |
|     }
 | |
|   #pragma omp target defaultmap(tofrom: scalar)
 | |
|   {
 | |
|     err = a++ != 29;
 | |
|     for (int i = 0; i < 10; i++)
 | |
|       {
 | |
| 	err |= b[i] != i ^ 1;
 | |
| 	b[i] = i + 5;
 | |
| 	if (i >= 6) continue;
 | |
| 	err |= z[i] != 2 * i + 10;
 | |
| 	z[i] = 9 - 3 * i;
 | |
| 	if (i == 5) continue;
 | |
| 	err |= d[i] != 7L - i;
 | |
| 	d[i] = i;
 | |
|       }
 | |
|     err |= c != 149;
 | |
|     c = -2;
 | |
|     err |= t != 15;
 | |
|     t = 155;
 | |
|   }
 | |
|   if (err || a != 30 || c != -2 || t != 155)
 | |
|     abort ();
 | |
|   for (int i = 0; i < 10; i++)
 | |
|     {
 | |
|       if (b[i] != i + 5) abort ();
 | |
|       if (i >= 6) continue;
 | |
|       if (z[i] != 9 - 3 * i) abort ();
 | |
|       z[i]++;
 | |
|       if (i == 5) continue;
 | |
|       if (d[i] != i) abort ();
 | |
|     }
 | |
|   #pragma omp target data map (alloc: z)
 | |
|   {
 | |
|     #pragma omp target update to (z)
 | |
|     #pragma omp target map(from: err)
 | |
|     {
 | |
|       err = 0;
 | |
|       for (int i = 0; i < 6; i++)
 | |
| 	if (z[i] != 10 - 3 * i) err = 1;
 | |
| 	else z[i] = i;
 | |
|     }
 | |
|     if (err) abort ();
 | |
|     #pragma omp target update from (z)
 | |
|   }
 | |
|   for (int i = 0; i < 6; i++)
 | |
|     if (z[i] != i)
 | |
|       abort ();
 | |
| }
 | |
| 
 | |
| int
 | |
| main ()
 | |
| {
 | |
|   int a = 7;
 | |
|   int b[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
 | |
|   short c = 25;
 | |
|   long d[5] = { 12, 13, 14, 15, 16 };
 | |
|   x = 8;
 | |
|   foo (a, b, c, d, 5);
 | |
| }
 |