target-40.c 864 B

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