1 /* { dg-do run } */ 2 3 int x, *p = &x; 4 extern void abort (void); 5 void 6 f1 (int *q) 7 { 8 *q = 1; 9 #pragma omp flush 10 /* x, p, and *q are flushed */ 11 /* because they are shared and accessible */ 12 /* q is not flushed because it is not shared. */ 13 } 14 15 void 16 f2 (int *q) 17 { 18 #pragma omp barrier 19 *q = 2; 20 #pragma omp barrier 21 /* a barrier implies a flush */ 22 /* x, p, and *q are flushed */ 23 /* because they are shared and accessible */ 24 /* q is not flushed because it is not shared. */ 25 } 26 27 int 28 g (int n) 29 { 30 int i = 1, j, sum = 0; 31 *p = 1; 32 #pragma omp parallel reduction(+: sum) num_threads(2) 33 { 34 f1 (&j); 35 /* i, n and sum were not flushed */ 36 /* because they were not accessible in f1 */ 37 /* j was flushed because it was accessible */ 38 sum += j; 39 f2 (&j); 40 /* i, n, and sum were not flushed */ 41 /* because they were not accessible in f2 */ 42 /* j was flushed because it was accessible */ 43 sum += i + j + *p + n; 44 } 45 return sum; 46 } 47 48 int 49 main () 50 { 51 int result = g (10); 52 if (result != 30) 53 abort (); 54 return 0; 55 } 56