1  /* PR middle-end/39154 */
       2  /* { dg-do compile } */
       3  /* { dg-additional-options "-std=gnu99" } */
       4  
       5  extern void abort (void);
       6  
       7  int n = 20;
       8  
       9  int
      10  main (void)
      11  {
      12    int a[n], b[n][n];
      13  
      14  #pragma omp parallel for
      15      for (int i = 0; i < n; i++)
      16        {
      17  	a[i] = i + 1;
      18  #pragma omp parallel for
      19  	for (int j = 0; j < n; j++)
      20  	  b[i][j] = a[i];
      21        }
      22  
      23    for (int i = 0; i < n; i++)
      24      {
      25        for (int j = 0; j < n; j++)
      26  	if (b[i][j] != i + 1)
      27  	  abort ();
      28        if (a[i] != i + 1)
      29  	abort ();
      30      }
      31  
      32  #pragma omp parallel for shared (n, a, b)
      33      for (int i = 0; i < n; i++)
      34        {
      35  	a[i] = i + 3;
      36  #pragma omp parallel for
      37  	for (int j = 0; j < n; j++)
      38  	  b[i][j] = a[i];
      39        }
      40  
      41    for (int i = 0; i < n; i++)
      42      {
      43        for (int j = 0; j < n; j++)
      44  	if (b[i][j] != i + 3)
      45  	  abort ();
      46        if (a[i] != i + 3)
      47  	abort ();
      48      }
      49  
      50  #pragma omp parallel for
      51      for (int i = 0; i < n; i++)
      52        {
      53  	a[i] = i + 5;
      54  #pragma omp parallel for shared (n, a, b)
      55  	for (int j = 0; j < n; j++)
      56  	  b[i][j] = a[i];
      57        }
      58  
      59    for (int i = 0; i < n; i++)
      60      {
      61        for (int j = 0; j < n; j++)
      62  	if (b[i][j] != i + 5)
      63  	  abort ();
      64        if (a[i] != i + 5)
      65  	abort ();
      66      }
      67  
      68  #pragma omp parallel for shared (n, a, b)
      69      for (int i = 0; i < n; i++)
      70        {
      71  	a[i] = i + 7;
      72  #pragma omp parallel for shared (n, a, b)
      73  	for (int j = 0; j < n; j++)
      74  	  b[i][j] = a[i];
      75        }
      76  
      77    for (int i = 0; i < n; i++)
      78      {
      79        for (int j = 0; j < n; j++)
      80  	if (b[i][j] != i + 7)
      81  	  abort ();
      82        if (a[i] != i + 7)
      83  	abort ();
      84      }
      85  
      86  #pragma omp parallel for private (a, b)
      87      for (int i = 0; i < n; i++)
      88        {
      89  	a[i] = i + 1;
      90  #pragma omp parallel for
      91  	for (int j = 0; j < n; j++)
      92  	  b[i][j] = a[i];
      93        }
      94  
      95  #pragma omp parallel for private (a, b)
      96      for (int i = 0; i < n; i++)
      97        {
      98  	a[i] = i + 1;
      99  #pragma omp parallel for private (b)
     100  	for (int j = 0; j < n; j++)
     101  	  b[i][j] = a[i];
     102        }
     103  
     104    return 0;
     105  }