1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -fopenmp -verify %s
2*67e74705SXin Li
3*67e74705SXin Li void foo();
4*67e74705SXin Li
5*67e74705SXin Li // expected-error@+1 {{unexpected OpenMP directive '#pragma omp single'}}
6*67e74705SXin Li #pragma omp single
7*67e74705SXin Li
8*67e74705SXin Li // expected-error@+1 {{unexpected OpenMP directive '#pragma omp single'}}
9*67e74705SXin Li #pragma omp single foo
10*67e74705SXin Li
test_no_clause()11*67e74705SXin Li void test_no_clause() {
12*67e74705SXin Li int i;
13*67e74705SXin Li #pragma omp single
14*67e74705SXin Li foo();
15*67e74705SXin Li
16*67e74705SXin Li #pragma omp single
17*67e74705SXin Li ++i;
18*67e74705SXin Li }
19*67e74705SXin Li
test_branch_protected_scope()20*67e74705SXin Li void test_branch_protected_scope() {
21*67e74705SXin Li int i = 0;
22*67e74705SXin Li L1:
23*67e74705SXin Li ++i;
24*67e74705SXin Li
25*67e74705SXin Li int x[24];
26*67e74705SXin Li
27*67e74705SXin Li #pragma omp parallel
28*67e74705SXin Li #pragma omp single
29*67e74705SXin Li {
30*67e74705SXin Li if (i == 5)
31*67e74705SXin Li goto L1; // expected-error {{use of undeclared label 'L1'}}
32*67e74705SXin Li else if (i == 6)
33*67e74705SXin Li return; // expected-error {{cannot return from OpenMP region}}
34*67e74705SXin Li else if (i == 7)
35*67e74705SXin Li goto L2;
36*67e74705SXin Li else if (i == 8) {
37*67e74705SXin Li L2:
38*67e74705SXin Li x[i]++;
39*67e74705SXin Li }
40*67e74705SXin Li }
41*67e74705SXin Li
42*67e74705SXin Li if (x[0] == 0)
43*67e74705SXin Li goto L2; // expected-error {{use of undeclared label 'L2'}}
44*67e74705SXin Li else if (x[1] == 1)
45*67e74705SXin Li goto L1;
46*67e74705SXin Li }
47*67e74705SXin Li
test_invalid_clause()48*67e74705SXin Li void test_invalid_clause() {
49*67e74705SXin Li int i;
50*67e74705SXin Li #pragma omp parallel
51*67e74705SXin Li // expected-warning@+1 {{extra tokens at the end of '#pragma omp single' are ignored}}
52*67e74705SXin Li #pragma omp single foo bar
53*67e74705SXin Li foo();
54*67e74705SXin Li }
55*67e74705SXin Li
test_non_identifiers()56*67e74705SXin Li void test_non_identifiers() {
57*67e74705SXin Li int i, x;
58*67e74705SXin Li
59*67e74705SXin Li #pragma omp parallel
60*67e74705SXin Li // expected-warning@+1 {{extra tokens at the end of '#pragma omp single' are ignored}}
61*67e74705SXin Li #pragma omp single;
62*67e74705SXin Li foo();
63*67e74705SXin Li #pragma omp parallel
64*67e74705SXin Li // expected-error@+2 {{unexpected OpenMP clause 'linear' in directive '#pragma omp single'}}
65*67e74705SXin Li // expected-warning@+1 {{extra tokens at the end of '#pragma omp single' are ignored}}
66*67e74705SXin Li #pragma omp single linear(x);
67*67e74705SXin Li foo();
68*67e74705SXin Li
69*67e74705SXin Li #pragma omp parallel
70*67e74705SXin Li // expected-warning@+1 {{extra tokens at the end of '#pragma omp single' are ignored}}
71*67e74705SXin Li #pragma omp single private(x);
72*67e74705SXin Li foo();
73*67e74705SXin Li
74*67e74705SXin Li #pragma omp parallel
75*67e74705SXin Li // expected-warning@+1 {{extra tokens at the end of '#pragma omp single' are ignored}}
76*67e74705SXin Li #pragma omp single, private(x);
77*67e74705SXin Li foo();
78*67e74705SXin Li }
79*67e74705SXin Li
test_private()80*67e74705SXin Li void test_private() {
81*67e74705SXin Li int i;
82*67e74705SXin Li #pragma omp parallel
83*67e74705SXin Li // expected-error@+2 {{expected expression}}
84*67e74705SXin Li // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
85*67e74705SXin Li #pragma omp single private(
86*67e74705SXin Li foo();
87*67e74705SXin Li #pragma omp parallel
88*67e74705SXin Li // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
89*67e74705SXin Li // expected-error@+1 2 {{expected expression}}
90*67e74705SXin Li #pragma omp single private(,
91*67e74705SXin Li foo();
92*67e74705SXin Li #pragma omp parallel
93*67e74705SXin Li // expected-error@+1 2 {{expected expression}}
94*67e74705SXin Li #pragma omp single private(, )
95*67e74705SXin Li foo();
96*67e74705SXin Li #pragma omp parallel
97*67e74705SXin Li // expected-error@+1 {{expected expression}}
98*67e74705SXin Li #pragma omp single private()
99*67e74705SXin Li foo();
100*67e74705SXin Li #pragma omp parallel
101*67e74705SXin Li // expected-error@+1 {{expected expression}}
102*67e74705SXin Li #pragma omp single private(int)
103*67e74705SXin Li foo();
104*67e74705SXin Li #pragma omp parallel
105*67e74705SXin Li // expected-error@+1 {{expected variable name}}
106*67e74705SXin Li #pragma omp single private(0)
107*67e74705SXin Li foo();
108*67e74705SXin Li
109*67e74705SXin Li int x, y, z;
110*67e74705SXin Li #pragma omp parallel
111*67e74705SXin Li #pragma omp single private(x)
112*67e74705SXin Li foo();
113*67e74705SXin Li #pragma omp parallel
114*67e74705SXin Li #pragma omp single private(x, y)
115*67e74705SXin Li foo();
116*67e74705SXin Li #pragma omp parallel
117*67e74705SXin Li #pragma omp single private(x, y, z)
118*67e74705SXin Li foo();
119*67e74705SXin Li }
120*67e74705SXin Li
test_firstprivate()121*67e74705SXin Li void test_firstprivate() {
122*67e74705SXin Li int i;
123*67e74705SXin Li #pragma omp parallel
124*67e74705SXin Li // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
125*67e74705SXin Li // expected-error@+1 {{expected expression}}
126*67e74705SXin Li #pragma omp single firstprivate(
127*67e74705SXin Li foo();
128*67e74705SXin Li
129*67e74705SXin Li #pragma omp parallel
130*67e74705SXin Li // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}
131*67e74705SXin Li // expected-error@+1 2 {{expected expression}}
132*67e74705SXin Li #pragma omp single firstprivate(,
133*67e74705SXin Li foo();
134*67e74705SXin Li #pragma omp parallel
135*67e74705SXin Li // expected-error@+1 2 {{expected expression}}
136*67e74705SXin Li #pragma omp single firstprivate(, )
137*67e74705SXin Li foo();
138*67e74705SXin Li #pragma omp parallel
139*67e74705SXin Li // expected-error@+1 {{expected expression}}
140*67e74705SXin Li #pragma omp single firstprivate()
141*67e74705SXin Li foo();
142*67e74705SXin Li #pragma omp parallel
143*67e74705SXin Li // expected-error@+1 {{expected expression}}
144*67e74705SXin Li #pragma omp single firstprivate(int)
145*67e74705SXin Li foo();
146*67e74705SXin Li #pragma omp parallel
147*67e74705SXin Li // expected-error@+1 {{expected variable name}}
148*67e74705SXin Li #pragma omp single firstprivate(0)
149*67e74705SXin Li foo();
150*67e74705SXin Li }
151*67e74705SXin Li
test_nowait()152*67e74705SXin Li void test_nowait() {
153*67e74705SXin Li #pragma omp single nowait nowait // expected-error {{directive '#pragma omp single' cannot contain more than one 'nowait' clause}}
154*67e74705SXin Li for (int i = 0; i < 16; ++i)
155*67e74705SXin Li ;
156*67e74705SXin Li }
157