(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
ptr-attach-1.c
       1  #include <stdlib.h>
       2  
       3  struct S
       4  {
       5    int a, b;
       6    int *ptr;
       7    int c, d;
       8  };
       9  typedef struct S S;
      10  
      11  #pragma omp declare target
      12  int *gp;
      13  #pragma omp end declare target
      14  
      15  #define N 10
      16  int main (void)
      17  {
      18    /* Test to see if pointer attachment works, for scalar pointers,
      19       and pointer fields in structures.  */
      20  
      21    int *ptr = (int *) malloc (sizeof (int) * N);
      22    int *orig_ptr = ptr;
      23  
      24    #pragma omp target map (ptr, ptr[:N])
      25    {
      26      for (int i = 0; i < N; i++)
      27        ptr[i] = N - i;
      28    }
      29  
      30    if (ptr != orig_ptr)
      31      abort ();
      32  
      33    for (int i = 0; i < N; i++)
      34      if (ptr[i] != N - i)
      35        abort ();
      36  
      37    S s = { 0 };
      38    s.ptr = ptr;
      39    #pragma omp target map (s, s.ptr[:N])
      40    {
      41      for (int i = 0; i < N; i++)
      42        s.ptr[i] = i;
      43  
      44      s.a = 1;
      45      s.b = 2;
      46    }
      47  
      48    if (s.ptr != ptr)
      49      abort ();
      50  
      51    for (int i = 0; i < N; i++)
      52      if (s.ptr[i] != i)
      53        abort ();
      54  
      55    if (s.a != 1 || s.b != 2 || s.c != 0 || s.d != 0)
      56      abort ();
      57  
      58    gp = (int *) malloc (sizeof (int) * N);
      59    orig_ptr = gp;
      60  
      61    for (int i = 0; i < N; i++)
      62      gp[i] = i - 1;
      63  
      64    #pragma omp target map (gp[:N])
      65    {
      66      for (int i = 0; i < N; i++)
      67        gp[i] += 1;
      68    }
      69  
      70    if (gp != orig_ptr)
      71      abort ();
      72  
      73    for (int i = 0; i < N; i++)
      74      if (gp[i] != i)
      75        abort ();
      76  
      77    free (ptr);
      78    free (gp);
      79  
      80    return 0;
      81  }
      82