member-6.C 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // { dg-do run }
  2. #include <omp.h>
  3. struct R { R () {}; ~R () {}; int r; };
  4. struct T { T () {}; virtual ~T () {}; int t; };
  5. int c;
  6. struct A : public R, virtual public T { A () : b(c) {} int a; int &b; void m1 (); };
  7. void
  8. take (int &a, int &b, int &c, int &d)
  9. {
  10. asm volatile ("" : : "g" (&a), "g" (&b), "g" (&c), "g" (&d) : "memory");
  11. }
  12. void
  13. A::m1 ()
  14. {
  15. #pragma omp parallel private (a, T::t) shared (r, A::b) default(none)
  16. {
  17. int q = omp_get_thread_num (), q2;
  18. a = q;
  19. t = 3 * q;
  20. #pragma omp single copyprivate (q2)
  21. {
  22. r = 2 * q;
  23. b = 4 * q;
  24. q2 = q;
  25. }
  26. take (a, r, t, b);
  27. #pragma omp barrier
  28. if (A::a != q || R::r != 2 * q2 || T::t != 3 * q || A::b != 4 * q2)
  29. __builtin_abort ();
  30. }
  31. a = 7;
  32. r = 8;
  33. t = 9;
  34. b = 10;
  35. #pragma omp parallel shared (A::a) default (none) firstprivate (R::r, b) shared (t)
  36. {
  37. int q = omp_get_thread_num (), q2;
  38. take (A::a, R::r, T::t, A::b);
  39. if (a != 7 || r != 8 || t != 9 || b != 10)
  40. __builtin_abort ();
  41. R::r = 6 * q;
  42. #pragma omp barrier
  43. #pragma omp single copyprivate (q2)
  44. {
  45. A::a = 5 * q;
  46. T::t = 7 * q;
  47. q2 = q;
  48. }
  49. A::b = 8 * q;
  50. take (a, r, t, b);
  51. #pragma omp barrier
  52. if (a != 5 * q2 || r != 6 * q || t != 7 * q2 || b != 8 * q)
  53. __builtin_abort ();
  54. }
  55. a = 1;
  56. b = 2;
  57. R::r = 3;
  58. t = 4;
  59. bool f = false;
  60. #pragma omp parallel private (f)
  61. {
  62. f = false;
  63. #pragma omp single
  64. #pragma omp taskloop default(none) firstprivate (r, A::a, f) shared (T::t, b)
  65. for (int i = 0; i < 30; i++)
  66. {
  67. int q = omp_get_thread_num ();
  68. int tv, bv;
  69. #pragma omp atomic read
  70. tv = t;
  71. #pragma omp atomic read
  72. bv = A::b;
  73. if (i == 16)
  74. {
  75. if (bv != 2 || tv != 4)
  76. __builtin_abort ();
  77. }
  78. else
  79. {
  80. if ((bv != 2 && bv != 8) || (tv != 4 && tv != 9))
  81. __builtin_abort ();
  82. }
  83. if (!f)
  84. {
  85. if (A::a != 1 || R::r != 3)
  86. __builtin_abort ();
  87. }
  88. else if (a != 7 * q || r != 9 * q)
  89. __builtin_abort ();
  90. take (a, r, t, b);
  91. A::a = 7 * q;
  92. R::r = 9 * q;
  93. if (i == 16)
  94. {
  95. #pragma omp atomic write
  96. A::b = 8;
  97. #pragma omp atomic write
  98. T::t = 9;
  99. }
  100. f = true;
  101. }
  102. }
  103. }
  104. int
  105. main ()
  106. {
  107. A a;
  108. a.m1 ();
  109. }