(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c/
target-11.c
       1  /* { dg-require-effective-target offload_device_nonshared_as } */
       2  
       3  #include <stdlib.h>
       4  #include <assert.h>
       5  
       6  #define N 32
       7  
       8  void test_array_section (int *p)
       9  {
      10    #pragma omp target data map(alloc: p[0:N])
      11      {
      12        int ok = 1;
      13        for (int i = 10; i < 10 + 4; i++)
      14  	p[i] = 997 * i;
      15  
      16        #pragma omp target map(always to:p[10:4]) map(tofrom: ok)
      17  	for (int i = 10; i < 10 + 4; i++)
      18  	  if (p[i] != 997 * i)
      19  	    ok = 0;
      20  
      21        assert (ok);
      22  
      23        #pragma omp target map(always from:p[7:9])
      24  	for (int i = 0; i < N; i++)
      25  	  p[i] = i;
      26      }
      27  }
      28  
      29  int main ()
      30  {
      31    int aa = 0, bb = 0, cc = 0, dd = 0;
      32  
      33    #pragma omp target data map(tofrom: aa) map(to: bb) map(from: cc, dd)
      34      {
      35        int ok;
      36        aa = bb = cc = 1;
      37  
      38        /* Set dd on target to 0 for the further check.  */
      39        #pragma omp target map(always to: dd)
      40  	;
      41  
      42        dd = 1;
      43        #pragma omp target map(tofrom: aa) map(always to: bb) \
      44  	map(always from: cc) map(to: dd) map(from: ok)
      45  	{
      46  	  /* bb is always to, aa and dd are not.  */
      47  	  ok = (aa == 0) && (bb == 1) && (dd == 0);
      48  	  aa = bb = cc = dd = 2;
      49  	}
      50  
      51        assert (ok);
      52        assert (aa == 1);
      53        assert (bb == 1);
      54        assert (cc == 2); /* cc is always from.  */
      55        assert (dd == 1);
      56  
      57        dd = 3;
      58        #pragma omp target map(from: cc) map(always to: dd) map(from: ok)
      59  	{
      60  	  ok = (dd == 3); /* dd is always to.  */
      61  	  cc = dd = 4;
      62  	}
      63  
      64        assert (ok);
      65        assert (cc == 2);
      66        assert (dd == 3);
      67      }
      68  
      69    assert (aa == 2);
      70    assert (bb == 1);
      71    assert (cc == 4);
      72    assert (dd == 4);
      73  
      74    int *array = calloc (N, sizeof (int));
      75    test_array_section (array);
      76  
      77    for (int i = 0; i < 7; i++)
      78      assert (array[i] == 0);
      79    for (int i = 7; i < 7 + 9; i++)
      80      assert (array[i] == i);
      81    for (int i = 7 + 9; i < N; i++)
      82      assert (array[i] == 0);
      83  
      84    free (array);
      85    return 0;
      86  }