aboutsummaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.oacc-c++/deep-copy-17.C
blob: dacbb520f3d892e7e6c0cc94ae7d8693e856be42 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <cassert>

/* Test attach/detach operation with pointers and references to structs.  */

typedef struct mystruct {
  int *a;
  int b;
  int *c;
  int d;
  int *e;
} mystruct;

void str (void)
{
  int a[10], c[10], e[10];
  mystruct m = { .a = a, .c = c, .e = e };
  a[0] = 5;
  c[0] = 7;
  e[0] = 9;
  #pragma acc parallel copy(m.a[0:10], m.b, m.c[0:10], m.d, m.e[0:10])
  {
    m.a[0] = m.c[0] + m.e[0];
  }
  assert (m.a[0] == 7 + 9);
}

void strp (void)
{
  int *a = new int[10];
  int *c = new int[10];
  int *e = new int[10];
  mystruct *m = new mystruct;
  m->a = a;
  m->c = c;
  m->e = e;
  a[0] = 6;
  c[0] = 8;
  e[0] = 10;
  #pragma acc parallel copy(m->a[0:10], m->b, m->c[0:10], m->d, m->e[0:10])
  {
    m->a[0] = m->c[0] + m->e[0];
  }
  assert (m->a[0] == 8 + 10);
  delete m;
  delete[] a;
  delete[] c;
  delete[] e;
}

void strr (void)
{
  int *a = new int[10];
  int *c = new int[10];
  int *e = new int[10];
  mystruct m;
  mystruct &n = m;
  n.a = a;
  n.c = c;
  n.e = e;
  a[0] = 7;
  c[0] = 9;
  e[0] = 11;
  #pragma acc parallel copy(n.a[0:10], n.b, n.c[0:10], n.d, n.e[0:10])
  {
    n.a[0] = n.c[0] + n.e[0];
  }
  assert (n.a[0] == 9 + 11);
  delete[] a;
  delete[] c;
  delete[] e;
}

void strrp (void)
{
  int a[10], c[10], e[10];
  mystruct *m = new mystruct;
  mystruct *&n = m;
  n->a = a;
  n->b = 3;
  n->c = c;
  n->d = 5;
  n->e = e;
  a[0] = 8;
  c[0] = 10;
  e[0] = 12;
  #pragma acc parallel copy(n->a[0:10], n->c[0:10], n->e[0:10])
  {
    n->a[0] = n->c[0] + n->e[0];
  }
  assert (n->a[0] == 10 + 12);
  delete m;
}

int main (int argc, char *argv[])
{
  str ();
  strp ();
  strr ();
  strrp ();
  return 0;
}