| // RUN: %clang_cc1 -fsyntax-only -fopenmp -verify %s |
| |
| void foo(); |
| |
| // expected-error@+1 {{unexpected OpenMP directive '#pragma omp sections'}} |
| #pragma omp sections |
| |
| // expected-error@+1 {{unexpected OpenMP directive '#pragma omp sections'}} |
| #pragma omp sections foo |
| |
| void test_no_clause() { |
| int i; |
| #pragma omp sections |
| { |
| foo(); |
| } |
| |
| // expected-error@+2 {{the statement for '#pragma omp sections' must be a compound statement}} |
| #pragma omp sections |
| ++i; |
| |
| #pragma omp sections |
| { |
| foo(); |
| foo(); // expected-error {{statement in 'omp sections' directive must be enclosed into a section region}} |
| } |
| } |
| |
| void test_branch_protected_scope() { |
| int i = 0; |
| L1: |
| ++i; |
| |
| int x[24]; |
| |
| #pragma omp parallel |
| #pragma omp sections |
| { |
| if (i == 5) |
| goto L1; // expected-error {{use of undeclared label 'L1'}} |
| else if (i == 6) |
| return; // expected-error {{cannot return from OpenMP region}} |
| else if (i == 7) |
| goto L2; |
| else if (i == 8) { |
| L2: |
| x[i]++; |
| } |
| #pragma omp section |
| if (i == 5) |
| goto L1; // expected-error {{use of undeclared label 'L1'}} |
| else if (i == 6) |
| return; // expected-error {{cannot return from OpenMP region}} |
| else if (i == 7) |
| goto L3; |
| else if (i == 8) { |
| L3: |
| x[i]++; |
| } |
| } |
| |
| if (x[0] == 0) |
| goto L2; // expected-error {{use of undeclared label 'L2'}} |
| else if (x[1] == 1) |
| goto L1; |
| goto L3; // expected-error {{use of undeclared label 'L3'}} |
| } |
| |
| void test_invalid_clause() { |
| int i; |
| #pragma omp parallel |
| // expected-warning@+1 {{extra tokens at the end of '#pragma omp sections' are ignored}} |
| #pragma omp sections foo bar |
| { |
| foo(); |
| // expected-error@+1 {{unexpected OpenMP clause 'nowait' in directive '#pragma omp section'}} |
| #pragma omp section nowait |
| ; |
| } |
| } |
| |
| void test_non_identifiers() { |
| int i, x; |
| |
| #pragma omp parallel |
| // expected-warning@+1 {{extra tokens at the end of '#pragma omp sections' are ignored}} |
| #pragma omp sections; |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| // expected-error@+2 {{unexpected OpenMP clause 'linear' in directive '#pragma omp sections'}} |
| // expected-warning@+1 {{extra tokens at the end of '#pragma omp sections' are ignored}} |
| #pragma omp sections linear(x); |
| { |
| foo(); |
| } |
| |
| #pragma omp parallel |
| // expected-warning@+1 {{extra tokens at the end of '#pragma omp sections' are ignored}} |
| #pragma omp sections private(x); |
| { |
| foo(); |
| } |
| |
| #pragma omp parallel |
| // expected-warning@+1 {{extra tokens at the end of '#pragma omp sections' are ignored}} |
| #pragma omp sections, private(x); |
| { |
| foo(); |
| } |
| } |
| |
| void test_private() { |
| int i; |
| #pragma omp parallel |
| // expected-error@+2 {{expected expression}} |
| // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} |
| #pragma omp sections private( |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} |
| // expected-error@+1 2 {{expected expression}} |
| #pragma omp sections private(, |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| // expected-error@+1 2 {{expected expression}} |
| #pragma omp sections private(, ) |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| // expected-error@+1 {{expected expression}} |
| #pragma omp sections private() |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| // expected-error@+1 {{expected expression}} |
| #pragma omp sections private(int) |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| // expected-error@+1 {{expected variable name}} |
| #pragma omp sections private(0) |
| { |
| foo(); |
| } |
| |
| int x, y, z; |
| #pragma omp parallel |
| #pragma omp sections private(x) |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| #pragma omp sections private(x, y) |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| #pragma omp sections private(x, y, z) |
| { |
| foo(); |
| } |
| } |
| |
| void test_lastprivate() { |
| int i; |
| #pragma omp parallel |
| // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} |
| // expected-error@+1 {{expected expression}} |
| #pragma omp sections lastprivate( |
| { |
| foo(); |
| } |
| |
| #pragma omp parallel |
| // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} |
| // expected-error@+1 2 {{expected expression}} |
| #pragma omp sections lastprivate(, |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| // expected-error@+1 2 {{expected expression}} |
| #pragma omp sections lastprivate(, ) |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| // expected-error@+1 {{expected expression}} |
| #pragma omp sections lastprivate() |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| // expected-error@+1 {{expected expression}} |
| #pragma omp sections lastprivate(int) |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| // expected-error@+1 {{expected variable name}} |
| #pragma omp sections lastprivate(0) |
| { |
| foo(); |
| } |
| |
| int x, y, z; |
| #pragma omp parallel |
| #pragma omp sections lastprivate(x) |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| #pragma omp sections lastprivate(x, y) |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| #pragma omp sections lastprivate(x, y, z) |
| { |
| foo(); |
| } |
| } |
| |
| void test_firstprivate() { |
| int i; |
| #pragma omp parallel |
| // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} |
| // expected-error@+1 {{expected expression}} |
| #pragma omp sections firstprivate( |
| { |
| foo(); |
| } |
| |
| #pragma omp parallel |
| // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} |
| // expected-error@+1 2 {{expected expression}} |
| #pragma omp sections firstprivate(, |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| // expected-error@+1 2 {{expected expression}} |
| #pragma omp sections firstprivate(, ) |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| // expected-error@+1 {{expected expression}} |
| #pragma omp sections firstprivate() |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| // expected-error@+1 {{expected expression}} |
| #pragma omp sections firstprivate(int) |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| // expected-error@+1 {{expected variable name}} |
| #pragma omp sections firstprivate(0) |
| { |
| foo(); |
| } |
| |
| int x, y, z; |
| #pragma omp parallel |
| #pragma omp sections lastprivate(x) firstprivate(x) |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| #pragma omp sections lastprivate(x, y) firstprivate(x, y) |
| { |
| foo(); |
| } |
| #pragma omp parallel |
| #pragma omp sections lastprivate(x, y, z) firstprivate(x, y, z) |
| { |
| foo(); |
| } |
| } |
| |
| void test_nowait() { |
| #pragma omp parallel |
| #pragma omp sections nowait nowait // expected-error {{directive '#pragma omp sections' cannot contain more than one 'nowait' clause}} |
| { |
| ; |
| } |
| } |