pr30703.C 819 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. // PR c++/30703
  2. // { dg-do run }
  3. #include <omp.h>
  4. extern "C" void abort ();
  5. int ctor, cctor, dtor;
  6. struct A
  7. {
  8. A();
  9. A(const A &);
  10. ~A();
  11. int i;
  12. };
  13. A::A()
  14. {
  15. #pragma omp atomic
  16. ctor++;
  17. }
  18. A::A(const A &r)
  19. {
  20. i = r.i;
  21. #pragma omp atomic
  22. cctor++;
  23. }
  24. A::~A()
  25. {
  26. #pragma omp atomic
  27. dtor++;
  28. }
  29. void
  30. foo (A a, A b)
  31. {
  32. int i, j = 0;
  33. #pragma omp parallel for firstprivate (a) lastprivate (a) private (b) schedule (static, 1) num_threads (5)
  34. for (i = 0; i < 5; i++)
  35. {
  36. b.i = 5;
  37. if (a.i != 6)
  38. #pragma omp atomic
  39. j += 1;
  40. a.i = b.i + i + 6;
  41. }
  42. if (j || a.i != 15)
  43. abort ();
  44. }
  45. void
  46. bar ()
  47. {
  48. A a, b;
  49. a.i = 6;
  50. b.i = 7;
  51. foo (a, b);
  52. }
  53. int
  54. main ()
  55. {
  56. omp_set_dynamic (false);
  57. if (ctor || cctor || dtor)
  58. abort ();
  59. bar ();
  60. if (ctor + cctor != dtor)
  61. abort ();
  62. }