/* { dg-do compile { target { c || c++11 } } } */ /* Check that a nested FOR loop with standard c/c++ attributes on it (not the C++ attribute syntax for OpenMP directives) gives an error. */ extern void do_something (void); /* This one should be OK, an empty attribute list is ignored in both C and C++. */ void imperfect1 (int x, int y) { #pragma omp for collapse (2) for (int i = 0; i < x; i++) { [[]] for (int j = 0; j < y; j++) do_something (); } } void perfect1 (int x, int y) { #pragma omp for ordered (2) for (int i = 0; i < x; i++) { [[]] for (int j = 0; j < y; j++) do_something (); } } /* Similar, but put the attributes on a block wrapping the nested loop instead. This is not allowed by the grammar. */ void imperfect2 (int x, int y) { #pragma omp for collapse (2) for (int i = 0; i < x; i++) /* { dg-error "not enough nested loops" } */ { [[]] { 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 } */ { [[]] { for (int j = 0; j < y; j++) /* { dg-error "loop not permitted in intervening code" } */ do_something (); } } } /* Make sure attributes are accepted in the innermost loop body, which has no intervening code restrictions. */ 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++) { [[]] 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++) { [[]] do_something (); } }