blob: dacbb520f3d892e7e6c0cc94ae7d8693e856be42 [file] [log] [blame]
#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;
}