1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- extern "C" void abort ();
- int w;
- struct S { int s, &t; S () : s (0), t (w) {}; void foo (short &); bool bar (int, int); void baz (short &); };
- bool
- S::bar (int i, int q)
- {
- switch (q)
- {
- case 0: return (i % 17) == 7;
- case 1: return (i % 19) == 2;
- case 2: return (i % 23) == 5;
- default: abort ();
- }
- }
- void
- S::foo (short &x)
- {
- #pragma omp for lastprivate (conditional: x, s, t)
- for (int i = 0; i < 1025; ++i)
- {
- if (bar (i, 0))
- x = i;
- if (bar (i, 1))
- s = i + 3;
- if (bar (i, 2))
- t = i + 6;
- }
- }
- void
- S::baz (short &x)
- {
- #pragma omp parallel for lastprivate (conditional: x, s, t) collapse (3)
- for (int i = 0; i < 15; ++i)
- for (int j = -4; j < 9; j++)
- for (int k = 12; k > 7; --k)
- {
- int l = (k - 8) + (j + 4) * 5 + i * 13 * 5;
- if (bar (l, 0))
- x = l;
- if (bar (l, 1))
- s = l + 3;
- if (bar (l, 2))
- t = l + 6;
- }
- }
- int
- main ()
- {
- short x;
- S s;
- #pragma omp parallel
- s.foo (x);
- if (x != 1010 || s.s != 1012 || s.t != 1023)
- abort ();
- s.baz (x);
- if (x != 959 || s.s != 974 || s.t != 977)
- abort ();
- }
|