1*404b540aSrobert /* { dg-do run } */ 2*404b540aSrobert 3*404b540aSrobert #include <omp.h> 4*404b540aSrobert 5*404b540aSrobert extern void abort (void); 6*404b540aSrobert 7*404b540aSrobert int main(void)8*404b540aSrobertmain (void) 9*404b540aSrobert { 10*404b540aSrobert int i = 5, l = 0; 11*404b540aSrobert int foo (void) { return i == 6; } 12*404b540aSrobert int bar (void) { return i - 3; } 13*404b540aSrobert 14*404b540aSrobert omp_set_dynamic (0); 15*404b540aSrobert 16*404b540aSrobert #pragma omp parallel if (foo ()) num_threads (bar ()) reduction (|:l) 17*404b540aSrobert if (omp_get_num_threads () != 1) 18*404b540aSrobert l = 1; 19*404b540aSrobert 20*404b540aSrobert i++; 21*404b540aSrobert 22*404b540aSrobert #pragma omp parallel if (foo ()) num_threads (bar ()) reduction (|:l) 23*404b540aSrobert if (omp_get_num_threads () != 3) 24*404b540aSrobert l = 1; 25*404b540aSrobert 26*404b540aSrobert i++; 27*404b540aSrobert 28*404b540aSrobert #pragma omp master 29*404b540aSrobert if (bar () != 4) 30*404b540aSrobert abort (); 31*404b540aSrobert 32*404b540aSrobert #pragma omp single 33*404b540aSrobert { 34*404b540aSrobert if (foo ()) 35*404b540aSrobert abort (); 36*404b540aSrobert i--; 37*404b540aSrobert if (! foo ()) 38*404b540aSrobert abort (); 39*404b540aSrobert } 40*404b540aSrobert 41*404b540aSrobert if (l) 42*404b540aSrobert abort (); 43*404b540aSrobert 44*404b540aSrobert i = 8; 45*404b540aSrobert #pragma omp atomic 46*404b540aSrobert l += bar (); 47*404b540aSrobert 48*404b540aSrobert if (l != 5) 49*404b540aSrobert abort (); 50*404b540aSrobert 51*404b540aSrobert return 0; 52*404b540aSrobert } 53