// { dg-do run } extern "C" void abort (); struct S; void foo (S *, S *); void bar (S &, S &); #pragma omp declare reduction (+:S:foo (&omp_out, &omp_in)) #pragma omp declare reduction (*:S:bar (omp_out, omp_in)) struct S { int s; S () : s (0) {} }; void foo (S *x, S *y) { x->s += y->s; } void bar (S &x, S &y) { x.s += y.s; } int main () { S s, t; int i = 0; #pragma omp parallel reduction (+:s, i) reduction (*:t) { if (s.s != 0 || t.s != 0) abort (); s.s = 2; t.s = 3; i = 1; } if (s.s != 2 * i || t.s != 3 * i) abort (); }