// 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}} { ; } }