(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c/
pr93566.c
       1  /* PR middle-end/93566 */
       2  /* { dg-additional-options "-std=c99" } */
       3  
       4  extern void abort (void);
       5  
       6  void
       7  foo (int *x)
       8  {
       9    void nest (void) {
      10      #pragma omp parallel for reduction(+:x[:10])
      11      for (int i = 0; i < 1024; i++)
      12        for (int j = 0; j < 10; j++)
      13  	x[j] += j * i;
      14    }
      15    nest ();
      16    for (int i = 0; i < 10; i++)
      17      if (x[i] != 1023 * 1024 / 2 * i)
      18        abort ();
      19  }
      20  
      21  void
      22  bar (void)
      23  {
      24    int x[10] = {};
      25    void nest (void) {
      26      #pragma omp parallel for reduction(+:x[:10])
      27      for (int i = 0; i < 1024; i++)
      28        for (int j = 0; j < 10; j++)
      29  	x[j] += j * i;
      30    }
      31    nest ();
      32    for (int i = 0; i < 10; i++)
      33      if (x[i] != 1023 * 1024 / 2 * i)
      34        abort ();
      35  }
      36  
      37  void
      38  baz (void)
      39  {
      40    int x[10] = {};
      41    void nest (void) {
      42      #pragma omp parallel for reduction(+:x[2:5])
      43      for (int i = 0; i < 1024; i++)
      44        for (int j = 2; j < 7; j++)
      45  	x[j] += j * i;
      46    }
      47    nest ();
      48    for (int i = 2; i < 7; i++)
      49      if (x[i] != 1023 * 1024 / 2 * i)
      50        abort ();
      51  }
      52  
      53  void
      54  qux (int *x)
      55  {
      56    void nest (void) { x++; }
      57    nest ();
      58    #pragma omp parallel for reduction(+:x[:9])
      59    for (int i = 0; i < 1024; i++)
      60      for (int j = 0; j < 9; j++)
      61        x[j] += j * i;
      62    nest ();
      63    for (int i = 0; i < 9; i++)
      64      if (x[i - 1] != 1023 * 1024 / 2 * i)
      65        abort ();
      66  }
      67  
      68  void
      69  quux (void)
      70  {
      71    int x[10];
      72    void nest (void) { for (int i = 0; i < 10; i++) x[i] = 0; }
      73    int nest2 (int i) { return x[i]; }
      74    nest ();
      75    #pragma omp parallel for reduction(+:x[:7])
      76    for (int i = 0; i < 1024; i++)
      77      for (int j = 0; j < 7; j++)
      78        x[j] += j * i;
      79    for (int i = 0; i < 7; i++)
      80      if (nest2 (i) != 1023 * 1024 / 2 * i)
      81        abort ();
      82  }
      83  
      84  void
      85  corge (void)
      86  {
      87    int x[10];
      88    void nest (void) { for (int i = 0; i < 10; i++) x[i] = 0; }
      89    int nest2 (int i) { return x[i]; }
      90    nest ();
      91    #pragma omp parallel for reduction(+:x[2:4])
      92    for (int i = 0; i < 1024; i++)
      93      for (int j = 2; j < 6; j++)
      94        x[j] += j * i;
      95    for (int i = 2; i < 6; i++)
      96      if (nest2 (i) != 1023 * 1024 / 2 * i)
      97        abort ();
      98  }
      99  
     100  int
     101  main ()
     102  {
     103    int a[10] = {};
     104    foo (a);
     105    bar ();
     106    baz ();
     107    for (int i = 0; i < 10; i++)
     108      a[i] = 0;
     109    qux (a);
     110    quux ();
     111    corge ();
     112    return 0;
     113  }