| /* { dg-do compile } */ |
| |
| /* Check that non-statement pragmas are accepted in a canonical loop nest |
| even when perfect nesting is required. */ |
| |
| extern void do_something (void); |
| |
| void imperfect1 (int x, int y) |
| { |
| #pragma omp for collapse (2) |
| for (int i = 0; i < x; i++) |
| { |
| #pragma GCC diagnostic push |
| for (int j = 0; j < y; j++) |
| do_something (); |
| #pragma GCC diagnostic pop |
| } |
| } |
| |
| void perfect1 (int x, int y) |
| { |
| #pragma omp for ordered (2) |
| for (int i = 0; i < x; i++) |
| { |
| #pragma GCC diagnostic push |
| for (int j = 0; j < y; j++) |
| do_something (); |
| #pragma GCC diagnostic pop |
| } |
| } |
| |
| |
| /* "GCC unroll" is a statement pragma that consumes the following loop as |
| a substatement. Thus, the inner loop should be treated as intervening |
| code rather than part of the loop nest. */ |
| |
| void imperfect2 (int x, int y) |
| { |
| #pragma omp for collapse (2) |
| for (int i = 0; i < x; i++) /* { dg-error "not enough nested loops" } */ |
| { |
| #pragma GCC unroll 4 |
| for (int j = 0; j < y; j++) /* { dg-error "loop not permitted in intervening code" } */ |
| do_something (); |
| } |
| } |
| |
| void perfect2 (int x, int y) |
| { |
| #pragma omp for ordered (2) |
| for (int i = 0; i < x; i++) /* { dg-error "not enough nested loops" } */ |
| /* { dg-error "inner loops must be perfectly nested" "" { target *-*-*} .-1 } */ |
| { |
| #pragma GCC unroll 4 |
| for (int j = 0; j < y; j++) /* { dg-error "loop not permitted in intervening code" } */ |
| do_something (); |
| } |
| } |
| |
| |
| /* Check that statement pragmas are accepted in the innermost loop body. */ |
| |
| void imperfect3 (int x, int y) |
| { |
| #pragma omp for collapse (2) |
| for (int i = 0; i < x; i++) |
| for (int j = 0; j < y; j++) |
| { |
| #pragma GCC unroll 4 |
| for (int k = 0; k < 4; k++) |
| do_something (); |
| } |
| } |
| |
| void perfect3 (int x, int y) |
| { |
| #pragma omp for ordered (2) |
| for (int i = 0; i < x; i++) |
| for (int j = 0; j < y; j++) |
| { |
| #pragma GCC unroll 4 |
| for (int k = 0; k < 4; k++) |
| do_something (); |
| } |
| } |