| /* { dg-do compile { target { c || c++11 } } } */ |
| /* { dg-additional-options "-std=c23" { target c } } */ |
| |
| /* Test that omp::sequence is handled properly in a loop nest, but that |
| invalid attribute specifiers are rejected. */ |
| |
| extern void dummy (int); |
| |
| void |
| test2 (void) |
| { |
| [[omp::directive (target parallel for collapse(2))]] |
| for (int i = -300; i != 100; ++i) |
| [[omp::directive (masked)]] /* { dg-error "expected 'for' loop or OpenMP loop transformation construct" } */ |
| for (int j = 0; j != 100; ++j) /* { dg-error "loop not permitted" } */ |
| dummy (i); |
| } |
| |
| void |
| test3 (void) |
| { |
| [[omp::directive (target parallel for collapse(2))]] |
| for (int i = -300; i != 100; ++i) |
| [[omp::directive (unroll, partial)]] /* { dg-error "attributes on the same statement" } */ |
| [[omp::directive (masked)]] |
| for (int j = 0; j != 100; ++j) |
| dummy (i); |
| } |
| |
| void |
| test4 (void) |
| { |
| [[omp::directive (target parallel for collapse(2))]] |
| for (int i = -300; i != 100; ++i) |
| [[omp::sequence (directive (unroll, partial), |
| directive (masked))]] /* { dg-error "loop nest expected" } */ |
| for (int j = 0; j != 100; ++j) |
| dummy (i); /* { dg-error "declared" } */ |
| } |
| |
| void |
| test5 (void) |
| { |
| [[omp::directive (target parallel for collapse(2))]] |
| for (int i = -300; i != 100; ++i) |
| [[omp::sequence (directive (masked), /* { dg-error "expected 'for' loop or OpenMP loop transformation construct" } */ |
| directive (unroll, partial))]] |
| for (int j = 0; j != 100; ++j) |
| dummy (i); |
| } |
| |
| void |
| test6 (void) |
| { |
| [[omp::directive (target parallel for collapse(2))]] |
| for (int i = -300; i != 100; ++i) |
| [[omp::directive (unroll, partial), /* { dg-error "attributes on the same statement" } */ |
| omp::directive (masked)]] |
| for (int j = 0; j != 100; ++j) |
| dummy (i); |
| } |