mirror of
https://github.com/autc04/Retro68.git
synced 2024-11-29 12:50:35 +00:00
155 lines
3.5 KiB
C
155 lines
3.5 KiB
C
extern "C" void abort (void);
|
|
union U { int x; long long y; };
|
|
struct T { int a; union U b; int c; };
|
|
struct S { int s; int u; T v; int x[10]; union U w; int y[10]; int z[10]; };
|
|
volatile int z;
|
|
|
|
template <typename R>
|
|
void
|
|
foo ()
|
|
{
|
|
R s;
|
|
s.template s = 0;
|
|
s.u = 1;
|
|
s.v.a = 2;
|
|
s.v.b.y = 3LL;
|
|
s.v.c = 19;
|
|
s.w.x = 4;
|
|
s.template x[0] = 7;
|
|
s.x[1] = 8;
|
|
s.y[3] = 9;
|
|
s.y[4] = 10;
|
|
s.y[5] = 11;
|
|
int err = 0;
|
|
#pragma omp target map (to:s.template v.template b, s.u, s.x[0:z + 2]) \
|
|
map (tofrom:s.y[3:3]) \
|
|
map (from: s.w, s.template z[z + 1:z + 3], err)
|
|
{
|
|
err = 0;
|
|
if (s.u != 1 || s.v.b.y != 3LL || s.x[0] != 7 || s.x[1] != 8
|
|
|| s.y[3] != 9 || s.y[4] != 10 || s.y[5] != 11)
|
|
err = 1;
|
|
s.w.x = 6;
|
|
s.y[3] = 12;
|
|
s.y[4] = 13;
|
|
s.y[5] = 14;
|
|
s.z[1] = 15;
|
|
s.z[2] = 16;
|
|
s.z[3] = 17;
|
|
}
|
|
if (err || s.w.x != 6 || s.y[3] != 12 || s.y[4] != 13 || s.y[5] != 14
|
|
|| s.z[1] != 15 || s.z[2] != 16 || s.z[3] != 17)
|
|
abort ();
|
|
s.u++;
|
|
s.v.a++;
|
|
s.v.b.y++;
|
|
s.w.x++;
|
|
s.x[1] = 18;
|
|
s.z[0] = 19;
|
|
#pragma omp target data map (tofrom: s)
|
|
#pragma omp target map (always to: s.template w, s.x[1], err) map (alloc:s.u, s. template v.template b, s.z[z:z + 1])
|
|
{
|
|
err = 0;
|
|
if (s.u != 2 || s.v.b.y != 4LL || s.w.x != 7 || s.x[1] != 18 || s.z[0] != 19)
|
|
err = 1;
|
|
s.w.x = 8;
|
|
s.x[1] = 20;
|
|
s.z[0] = 21;
|
|
}
|
|
if (err || s.w.x != 8 || s.x[1] != 20 || s.z[0] != 21)
|
|
abort ();
|
|
s.u++;
|
|
s.v.a++;
|
|
s.v.b.y++;
|
|
s.w.x++;
|
|
s.x[0] = 22;
|
|
s.x[1] = 23;
|
|
#pragma omp target data map (from: s.w, s.x[0:2]) map (to: s.v.b, s.u)
|
|
#pragma omp target map (always to: s.w, s.x[0:2], err) map (alloc:s.u, s.v.b)
|
|
{
|
|
err = 0;
|
|
if (s.u != 3 || s.v.b.y != 5LL || s.w.x != 9 || s.x[0] != 22 || s.x[1] != 23)
|
|
err = 1;
|
|
s.w.x = 11;
|
|
s.x[0] = 24;
|
|
s.x[1] = 25;
|
|
}
|
|
if (err || s.w.x != 11 || s.x[0] != 24 || s.x[1] != 25)
|
|
abort ();
|
|
}
|
|
|
|
int
|
|
main ()
|
|
{
|
|
S s;
|
|
s.s = 0;
|
|
s.u = 1;
|
|
s.v.a = 2;
|
|
s.v.b.y = 3LL;
|
|
s.v.c = 19;
|
|
s.w.x = 4;
|
|
s.x[0] = 7;
|
|
s.x[1] = 8;
|
|
s.y[3] = 9;
|
|
s.y[4] = 10;
|
|
s.y[5] = 11;
|
|
int err = 0;
|
|
#pragma omp target map (to:s.v.b, s.u, s.x[0:z + 2]) \
|
|
map (tofrom:s.y[3:3]) \
|
|
map (from: s.w, s.z[z + 1:z + 3], err)
|
|
{
|
|
err = 0;
|
|
if (s.u != 1 || s.v.b.y != 3LL || s.x[0] != 7 || s.x[1] != 8
|
|
|| s.y[3] != 9 || s.y[4] != 10 || s.y[5] != 11)
|
|
err = 1;
|
|
s.w.x = 6;
|
|
s.y[3] = 12;
|
|
s.y[4] = 13;
|
|
s.y[5] = 14;
|
|
s.z[1] = 15;
|
|
s.z[2] = 16;
|
|
s.z[3] = 17;
|
|
}
|
|
if (err || s.w.x != 6 || s.y[3] != 12 || s.y[4] != 13 || s.y[5] != 14
|
|
|| s.z[1] != 15 || s.z[2] != 16 || s.z[3] != 17)
|
|
abort ();
|
|
s.u++;
|
|
s.v.a++;
|
|
s.v.b.y++;
|
|
s.w.x++;
|
|
s.x[1] = 18;
|
|
s.z[0] = 19;
|
|
#pragma omp target data map (tofrom: s)
|
|
#pragma omp target map (always to: s.w, s.x[1], err) map (alloc:s.u, s.v.b, s.z[z:z + 1])
|
|
{
|
|
err = 0;
|
|
if (s.u != 2 || s.v.b.y != 4LL || s.w.x != 7 || s.x[1] != 18 || s.z[0] != 19)
|
|
err = 1;
|
|
s.w.x = 8;
|
|
s.x[1] = 20;
|
|
s.z[0] = 21;
|
|
}
|
|
if (err || s.w.x != 8 || s.x[1] != 20 || s.z[0] != 21)
|
|
abort ();
|
|
s.u++;
|
|
s.v.a++;
|
|
s.v.b.y++;
|
|
s.w.x++;
|
|
s.x[0] = 22;
|
|
s.x[1] = 23;
|
|
#pragma omp target data map (from: s.w, s.x[0:2]) map (to: s.v.b, s.u)
|
|
#pragma omp target map (always to: s.w, s.x[0:2], err) map (alloc:s.u, s.v.b)
|
|
{
|
|
err = 0;
|
|
if (s.u != 3 || s.v.b.y != 5LL || s.w.x != 9 || s.x[0] != 22 || s.x[1] != 23)
|
|
err = 1;
|
|
s.w.x = 11;
|
|
s.x[0] = 24;
|
|
s.x[1] = 25;
|
|
}
|
|
if (err || s.w.x != 11 || s.x[0] != 24 || s.x[1] != 25)
|
|
abort ();
|
|
foo <S> ();
|
|
return 0;
|
|
}
|