(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
target-40.c
       1  /* { dg-do run } */
       2  /* { dg-options "-O0" } */
       3  
       4  extern
       5  #ifdef __cplusplus
       6  "C"
       7  #endif
       8  void abort (void);
       9  volatile int v;
      10  #pragma omp declare target to (v)
      11  typedef void (*fnp1) (void);
      12  typedef fnp1 (*fnp2) (void);
      13  void f1 (void) { v++; }
      14  void f2 (void) { v += 4; }
      15  void f3 (void) { v += 16; f1 (); }
      16  fnp1 f4 (void) { v += 64; return f2; }
      17  int a = 1;
      18  int *b = &a;
      19  int **c = &b;
      20  fnp2 f5 (void) { f3 (); return f4; }
      21  #pragma omp declare target enter (c)
      22  
      23  int
      24  main ()
      25  {
      26    int err = 0;
      27    #pragma omp target map(from:err)
      28    {
      29      volatile int xa;
      30      int *volatile xb;
      31      int **volatile xc;
      32      fnp2 xd;
      33      fnp1 xe;
      34      err = 0;
      35      xa = a;
      36      err |= xa != 1;
      37      xb = b;
      38      err |= xb != &a;
      39      xc = c;
      40      err |= xc != &b;
      41      xd = f5 ();
      42      err |= v != 17;
      43      xe = xd ();
      44      err |= v != 81;
      45      xe ();
      46      err |= v != 85;
      47    }
      48    if (err)
      49      abort ();
      50    return 0;
      51  }