1*404b540aSrobert /* { dg-do run } */ 2*404b540aSrobert 3*404b540aSrobert #include <stdio.h> 4*404b540aSrobert #include <omp.h> 5*404b540aSrobert extern void abort (void); 6*404b540aSrobert int main()7*404b540aSrobertmain () 8*404b540aSrobert { 9*404b540aSrobert int bad, x; 10*404b540aSrobert x = 2; 11*404b540aSrobert bad = 0; 12*404b540aSrobert #pragma omp parallel num_threads(2) shared(x, bad) 13*404b540aSrobert { 14*404b540aSrobert if (omp_get_thread_num () == 0) 15*404b540aSrobert { 16*404b540aSrobert volatile int i; 17*404b540aSrobert for (i = 0; i < 100000000; i++) 18*404b540aSrobert x = 5; 19*404b540aSrobert } 20*404b540aSrobert else 21*404b540aSrobert { 22*404b540aSrobert /* Print 1: the following read of x has a race */ 23*404b540aSrobert if (x != 2 && x != 5) 24*404b540aSrobert bad = 1; 25*404b540aSrobert } 26*404b540aSrobert #pragma omp barrier 27*404b540aSrobert if (omp_get_thread_num () == 0) 28*404b540aSrobert { 29*404b540aSrobert /* x must be 5 now. */ 30*404b540aSrobert if (x != 5) 31*404b540aSrobert bad = 1; 32*404b540aSrobert } 33*404b540aSrobert else 34*404b540aSrobert { 35*404b540aSrobert /* x must be 5 now. */ 36*404b540aSrobert if (x != 5) 37*404b540aSrobert bad = 1; 38*404b540aSrobert } 39*404b540aSrobert } 40*404b540aSrobert 41*404b540aSrobert if (bad) 42*404b540aSrobert abort (); 43*404b540aSrobert 44*404b540aSrobert return 0; 45*404b540aSrobert } 46