1  /* { dg-do run } */
       2  
       3  #include <omp.h>
       4  #include <stdlib.h>
       5  #include <string.h>
       6  
       7  int
       8  main (int argc, char **argv[])
       9  {
      10    int n = argc < 5 ? 12 : 31, i, m, l;
      11    char a[n + 3];
      12    unsigned short b[n / 2 - 1];
      13    int c[n * 2 + 1];
      14  
      15    for (i = 0; i < n + 3; i++)
      16      a[i] = i;
      17    for (i = 0; i < n / 2 - 1; i++)
      18      b[i] = (i << 8) | i;
      19    for (i = 0; i < n * 2 + 1; i++)
      20      c[i] = (i << 24) | i;
      21    l = 0;
      22    m = n;
      23  #pragma omp parallel default (shared) num_threads (4) \
      24    firstprivate (a, m) private (b, i) reduction (+:l)
      25    {
      26      for (i = 0; i < m + 3; i++)
      27        if (a[i] != i)
      28  	l++;
      29      for (i = 0; i < m * 2 + 1; i++)
      30        if (c[i] != ((i << 24) | i))
      31  	l++;
      32  #pragma omp barrier
      33      memset (a, omp_get_thread_num (), m + 3);
      34      for (i = 0; i < m / 2 - 1; i++)
      35        b[i] = a[0] + 7;
      36  #pragma omp master
      37      {
      38        for (i = 0; i < m * 2 + 1; i++)
      39  	c[i] = a[0] + 16;
      40      }
      41  #pragma omp barrier
      42      if (a[0] != omp_get_thread_num ())
      43        l++;
      44      for (i = 1; i < m + 3; i++)
      45        if (a[i] != a[0])
      46  	l++;
      47      for (i = 0; i < m / 2 - 1; i++)
      48        if (b[i] != a[0] + 7)
      49  	l++;
      50      for (i = 0; i < m * 2 + 1; i++)
      51        if (c[i] != 16)
      52  	l++;
      53    }
      54    if (l)
      55      abort ();
      56    for (i = 0; i < n * 2 + 1; i++)
      57      if (c[i] != 16)
      58        l++;
      59    return 0;
      60  }