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