(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
get-mapped-ptr-4.c
       1  #include <omp.h>
       2  #include <stdlib.h>
       3  
       4  int
       5  main ()
       6  {
       7    int d = omp_get_default_device ();
       8    int id = omp_get_initial_device ();
       9    struct s_t { int m1; char m2; } s;
      10    void *p1 = NULL, *p2 = NULL;
      11  
      12    if (d < 0 || d >= omp_get_num_devices ())
      13      d = id;
      14  
      15    #pragma omp target data map(alloc: s, s.m2) device(d)
      16    {
      17      #pragma omp target map(from: p1, p2) map(alloc: s, s.m2) device(d)
      18      {
      19        p1 = &s;
      20        p2 = &s.m2;
      21      }
      22      if (omp_get_mapped_ptr (&s, d) != (d == id ? &s : p1)
      23  	|| omp_get_mapped_ptr (&s.m2, d) != (d == id ? &s.m2 : p2))
      24        abort ();
      25    }
      26  
      27    if (omp_get_mapped_ptr (&s, d) != (d == id ? &s : NULL)
      28        || omp_get_mapped_ptr (&s.m2, d) != (d == id ? &s.m2 : NULL))
      29      abort ();
      30  
      31    #pragma omp target enter data map(alloc: s, s.m2) device (d)
      32    #pragma omp target map(from: p1, p2) map(alloc: s, s.m2) device(d)
      33    {
      34      p1 = &s;
      35      p2 = &s.m2;
      36    }
      37  
      38    if (omp_get_mapped_ptr (&s, d) != (d == id ? &s : p1)
      39        || omp_get_mapped_ptr (&s.m2, d) != (d == id ? &s.m2 : p2))
      40      abort ();
      41  
      42    #pragma omp target exit data map (delete: s, s.m2) device (d)
      43  
      44    if (omp_get_mapped_ptr (&s, d) != (d == id ? &s : NULL)
      45        || omp_get_mapped_ptr (&s.m2, d) != (d == id ? &s.m2 : NULL))
      46      abort ();
      47  
      48    return 0;
      49  }