| // PR c++/60228 |
| // { dg-additional-options "-std=c++11" } |
| |
| extern "C" void abort (); |
| |
| struct A |
| { |
| typedef int T; |
| #pragma omp declare reduction (y : T : [&omp_out, &omp_in]() { omp_out += omp_in; return 0; }()) initializer (omp_priv = [omp_orig]() { return omp_orig; }()) |
| static void foo (); |
| }; |
| |
| template <typename T> |
| struct B |
| { |
| #pragma omp declare reduction (y : T : [&omp_out, &omp_in]() { omp_out += omp_in; return 0; }()) initializer (omp_priv = [omp_orig]() { return omp_orig; }()) |
| static void foo (); |
| }; |
| |
| void |
| A::foo () |
| { |
| int r = 0, s = 0; |
| #pragma omp parallel for reduction (y : r, s) |
| for (int i = 0; i < 64; i++) |
| { |
| r++; |
| s += i; |
| } |
| if (r != 64 || s != (64 * 63) / 2) |
| abort (); |
| } |
| |
| template <typename T> |
| void |
| B<T>::foo () |
| { |
| T r = 0, s = 0; |
| #pragma omp parallel for reduction (y : r, s) |
| for (int i = 0; i < 64; i++) |
| { |
| r++; |
| s += i; |
| } |
| if (r != 64 || s != (64 * 63) / 2) |
| abort (); |
| } |
| |
| int |
| main () |
| { |
| A::foo (); |
| B<short>::foo (); |
| } |