mirror of
https://github.com/autc04/Retro68.git
synced 2024-11-30 19:53:46 +00:00
73 lines
1.1 KiB
C
73 lines
1.1 KiB
C
// { dg-do run }
|
|
|
|
extern "C" void abort ();
|
|
|
|
struct S
|
|
{
|
|
int s;
|
|
void foo (S &x) { s += x.s; }
|
|
S (const S &x) { s = x.s + 1; }
|
|
S () { s = 6; }
|
|
~S () {}
|
|
};
|
|
|
|
void
|
|
bar (S &x, S &y)
|
|
{
|
|
if (x.s != 6 || y.s != 6)
|
|
abort ();
|
|
x.s = 8;
|
|
}
|
|
|
|
#pragma omp declare reduction (foo: S: omp_out.foo (omp_in)) \
|
|
initializer (omp_priv (omp_orig))
|
|
#pragma omp declare reduction (bar : S: omp_out.foo (omp_in)) \
|
|
initializer (bar (omp_priv, omp_orig))
|
|
|
|
S
|
|
baz (S x)
|
|
{
|
|
S r;
|
|
int i = 0;
|
|
if (x.s != 7 || r.s != 6)
|
|
abort ();
|
|
#pragma omp parallel reduction (foo: x) reduction (bar: r) \
|
|
reduction (+: i)
|
|
{
|
|
if (x.s != 8 || r.s != 8)
|
|
abort ();
|
|
x.s = 12;
|
|
r.s = 14;
|
|
i = 1;
|
|
}
|
|
if (x.s != 7 + 12 * i || r.s != 6 + 14 * i)
|
|
abort ();
|
|
return r;
|
|
}
|
|
|
|
void
|
|
baz (S &x, S &y)
|
|
{
|
|
int i = 0, &j = i;
|
|
#pragma omp parallel reduction (foo: x) reduction (bar: y) \
|
|
reduction (+: i)
|
|
{
|
|
if (x.s != 7 || y.s != 8)
|
|
abort ();
|
|
x.s = 12;
|
|
y.s = 14;
|
|
i = 1;
|
|
}
|
|
if (x.s != 6 + 12 * j || y.s != 6 + 14 * j)
|
|
abort ();
|
|
}
|
|
|
|
int
|
|
main ()
|
|
{
|
|
S s;
|
|
baz (s);
|
|
S t, u;
|
|
baz (t, u);
|
|
}
|