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