1  /* PR c/79940 */
       2  
       3  int
       4  main ()
       5  {
       6    int i, j, l, m;
       7    int a[10000], b[10000], c[10000];
       8    for (i = 0; i < 10000; i++)
       9      {
      10        a[i] = i;
      11        b[i] = i & 31;
      12      }
      13  #pragma omp parallel shared(a, b, c)
      14  #pragma omp single
      15  #pragma omp taskloop shared(a, b, c)
      16    for (i = 0; i < 10000; i++)
      17      c[i] = a[i] + b[i];
      18  #pragma omp parallel
      19  #pragma omp single
      20    {
      21      #pragma omp taskloop shared(a, b, c) lastprivate (i)
      22      for (i = 0; i < 10000; i++)
      23        c[i] += a[i] + b[i];
      24      l = i;
      25    }
      26  #pragma omp parallel
      27  #pragma omp single
      28  #pragma omp taskloop shared(a, b, c) collapse(2)
      29    for (i = 0; i < 100; i++)
      30      for (j = 0; j < 100; j++)
      31        c[i * 100 + j] += a[i * 100 + j] + b[i * 100 + j];
      32  #pragma omp parallel
      33  #pragma omp single
      34    {
      35      #pragma omp taskloop shared(a, b, c) lastprivate (i, j)
      36      for (i = 0; i < 100; i++)
      37        for (j = 0; j < 100; j++)
      38  	c[i * 100 + j] += a[i * 100 + j] + b[i * 100 + j];
      39      m = i * 100 + j;
      40    }
      41    for (i = 0; i < 10000; i++)
      42      if (a[i] != i || b[i] != (i & 31) || c[i] != 4 * i + 4 * (i & 31))
      43        __builtin_abort ();
      44    if (l != 10000 || m != 10100)
      45      __builtin_abort ();
      46    return 0;
      47  }