(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.oacc-c-c++-common/
deep-copy-arrayofstruct.c
       1  /* { dg-do run } */
       2  
       3  #include <stdlib.h>
       4  #include <stdio.h>
       5  
       6  typedef struct {
       7    int *a;
       8    int *b;
       9    int *c;
      10  } mystruct;
      11  
      12  int main(int argc, char* argv[])
      13  {
      14    const int N = 1024;
      15    const int S = 32;
      16    mystruct *m = (mystruct *) calloc (S, sizeof (*m));
      17    int i, j;
      18  
      19    for (i = 0; i < S; i++)
      20      {
      21        m[i].a = (int *) malloc (N * sizeof (int));
      22        m[i].b = (int *) malloc (N * sizeof (int));
      23        m[i].c = (int *) malloc (N * sizeof (int));
      24      }
      25  
      26    for (j = 0; j < S; j++)
      27      for (i = 0; i < N; i++)
      28        {
      29  	m[j].a[i] = 0;
      30  	m[j].b[i] = 0;
      31  	m[j].c[i] = 0;
      32        }
      33  
      34  #pragma acc enter data copyin(m[0:1])
      35  
      36    for (int i = 0; i < 99; i++)
      37      {
      38        int j, k;
      39        for (k = 0; k < S; k++)
      40  #pragma acc parallel loop copy(m[k].a[0:N])
      41          for (j = 0; j < N; j++)
      42            m[k].a[j]++;
      43  
      44        for (k = 0; k < S; k++)
      45  #pragma acc parallel loop copy(m[k].b[0:N], m[k].c[5:N-10])
      46  	for (j = 0; j < N; j++)
      47  	  {
      48  	    m[k].b[j]++;
      49  	    if (j > 5 && j < N - 5)
      50  	      m[k].c[j]++;
      51  	}
      52      }
      53  
      54  #pragma acc exit data copyout(m[0:1])
      55  
      56    for (j = 0; j < S; j++)
      57      {
      58        for (i = 0; i < N; i++)
      59  	{
      60  	  if (m[j].a[i] != 99)
      61  	    abort ();
      62  	  if (m[j].b[i] != 99)
      63  	    abort ();
      64  	  if (i > 5 && i < N-5)
      65  	    {
      66  	      if (m[j].c[i] != 99)
      67  		abort ();
      68  	    }
      69  	  else
      70  	    {
      71  	      if (m[j].c[i] != 0)
      72  		abort ();
      73  	    }
      74  	}
      75  
      76        free (m[j].a);
      77        free (m[j].b);
      78        free (m[j].c);
      79      }
      80    free (m);
      81  
      82    return 0;
      83  }