1 // RUN: %clang_cc1 -fsyntax-only -fopenmp -verify %s 2 3 void foo(); 4 5 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp parallel sections'}} 6 #pragma omp parallel sections 7 8 // expected-error@+1 {{unexpected OpenMP directive '#pragma omp parallel sections'}} 9 #pragma omp parallel sections foo 10 11 void test_no_clause() { 12 int i; 13 #pragma omp parallel sections 14 { 15 foo(); 16 } 17 18 // expected-error@+2 {{the statement for '#pragma omp parallel sections' must be a compound statement}} 19 #pragma omp parallel sections 20 ++i; 21 22 #pragma omp parallel sections 23 { 24 foo(); 25 foo(); // expected-error {{statement in 'omp parallel sections' directive must be enclosed into a section region}} 26 } 27 28 } 29 30 void test_branch_protected_scope() { 31 int i = 0; 32 L1: 33 ++i; 34 35 int x[24]; 36 37 #pragma omp parallel sections 38 { 39 if (i == 5) 40 goto L1; // expected-error {{use of undeclared label 'L1'}} 41 else if (i == 6) 42 return; // expected-error {{cannot return from OpenMP region}} 43 else if (i == 7) 44 goto L2; 45 else if (i == 8) { 46 L2: 47 x[i]++; 48 } 49 #pragma omp section 50 if (i == 5) 51 goto L1; // expected-error {{use of undeclared label 'L1'}} 52 else if (i == 6) 53 return; // expected-error {{cannot return from OpenMP region}} 54 else if (i == 7) 55 goto L3; 56 else if (i == 8) { 57 L3: 58 x[i]++; 59 } 60 } 61 62 if (x[0] == 0) 63 goto L2; // expected-error {{use of undeclared label 'L2'}} 64 else if (x[1] == 1) 65 goto L1; 66 goto L3; // expected-error {{use of undeclared label 'L3'}} 67 } 68 69 void test_invalid_clause() { 70 int i; 71 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel sections' are ignored}} 72 #pragma omp parallel sections foo bar 73 { 74 foo(); 75 // expected-error@+1 {{unexpected OpenMP clause 'nowait' in directive '#pragma omp section'}} 76 #pragma omp section nowait 77 ; 78 } 79 } 80 81 void test_non_identifiers() { 82 int i, x; 83 84 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel sections' are ignored}} 85 #pragma omp parallel sections; 86 { 87 foo(); 88 } 89 // expected-error@+2 {{unexpected OpenMP clause 'linear' in directive '#pragma omp parallel sections'}} 90 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel sections' are ignored}} 91 #pragma omp parallel sections linear(x); 92 { 93 foo(); 94 } 95 96 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel sections' are ignored}} 97 #pragma omp parallel sections private(x); 98 { 99 foo(); 100 } 101 102 // expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel sections' are ignored}} 103 #pragma omp parallel sections, private(x); 104 { 105 foo(); 106 } 107 } 108 109 void test_private() { 110 int i; 111 // expected-error@+2 {{expected expression}} 112 // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}} 113 #pragma omp parallel sections private( 114 { 115 foo(); 116 } 117 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} 118 // expected-error@+1 2 {{expected expression}} 119 #pragma omp parallel sections private(, 120 { 121 foo(); 122 } 123 // expected-error@+1 2 {{expected expression}} 124 #pragma omp parallel sections private(, ) 125 { 126 foo(); 127 } 128 // expected-error@+1 {{expected expression}} 129 #pragma omp parallel sections private() 130 { 131 foo(); 132 } 133 // expected-error@+1 {{expected expression}} 134 #pragma omp parallel sections private(int) 135 { 136 foo(); 137 } 138 // expected-error@+1 {{expected variable name}} 139 #pragma omp parallel sections private(0) 140 { 141 foo(); 142 } 143 144 int x, y, z; 145 #pragma omp parallel sections private(x) 146 { 147 foo(); 148 } 149 #pragma omp parallel sections private(x, y) 150 { 151 foo(); 152 } 153 #pragma omp parallel sections private(x, y, z) 154 { 155 foo(); 156 } 157 } 158 159 void test_lastprivate() { 160 int i; 161 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} 162 // expected-error@+1 {{expected expression}} 163 #pragma omp parallel sections lastprivate( 164 { 165 foo(); 166 } 167 168 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} 169 // expected-error@+1 2 {{expected expression}} 170 #pragma omp parallel sections lastprivate(, 171 { 172 foo(); 173 } 174 // expected-error@+1 2 {{expected expression}} 175 #pragma omp parallel sections lastprivate(, ) 176 { 177 foo(); 178 } 179 // expected-error@+1 {{expected expression}} 180 #pragma omp parallel sections lastprivate() 181 { 182 foo(); 183 } 184 // expected-error@+1 {{expected expression}} 185 #pragma omp parallel sections lastprivate(int) 186 { 187 foo(); 188 } 189 // expected-error@+1 {{expected variable name}} 190 #pragma omp parallel sections lastprivate(0) 191 { 192 foo(); 193 } 194 195 int x, y, z; 196 #pragma omp parallel sections lastprivate(x) 197 { 198 foo(); 199 } 200 #pragma omp parallel sections lastprivate(x, y) 201 { 202 foo(); 203 } 204 #pragma omp parallel sections lastprivate(x, y, z) 205 { 206 foo(); 207 } 208 } 209 210 void test_firstprivate() { 211 int i; 212 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} 213 // expected-error@+1 {{expected expression}} 214 #pragma omp parallel sections firstprivate( 215 { 216 foo(); 217 } 218 219 // expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}} 220 // expected-error@+1 2 {{expected expression}} 221 #pragma omp parallel sections firstprivate(, 222 { 223 foo(); 224 } 225 // expected-error@+1 2 {{expected expression}} 226 #pragma omp parallel sections firstprivate(, ) 227 { 228 foo(); 229 } 230 // expected-error@+1 {{expected expression}} 231 #pragma omp parallel sections firstprivate() 232 { 233 foo(); 234 } 235 // expected-error@+1 {{expected expression}} 236 #pragma omp parallel sections firstprivate(int) 237 { 238 foo(); 239 } 240 // expected-error@+1 {{expected variable name}} 241 #pragma omp parallel sections firstprivate(0) 242 { 243 foo(); 244 } 245 246 int x, y, z; 247 #pragma omp parallel sections lastprivate(x) firstprivate(x) 248 { 249 foo(); 250 } 251 #pragma omp parallel sections lastprivate(x, y) firstprivate(x, y) 252 { 253 foo(); 254 } 255 #pragma omp parallel sections lastprivate(x, y, z) firstprivate(x, y, z) 256 { 257 foo(); 258 } 259 } 260 261