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  }