target-39.c 838 B

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