317 lines · c
1// RUN: %clang_cc1 -fsyntax-only -fopenmp -verify %s -Wuninitialized2 3// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -verify %s -Wuninitialized4 5// expected-error@+1 {{unexpected OpenMP directive '#pragma omp parallel for'}}6#pragma omp parallel for7 8// expected-error@+1 {{unexpected OpenMP directive '#pragma omp parallel for'}}9#pragma omp parallel for foo10 11void test_no_clause(void) {12 int i;13#pragma omp parallel for14 for (i = 0; i < 16; ++i)15 ;16 17// expected-error@+2 {{statement after '#pragma omp parallel for' must be a for loop}}18#pragma omp parallel for19 ++i;20}21 22void test_branch_protected_scope(void) {23 int i = 0;24L1:25 ++i;26 27 int x[24];28 29#pragma omp parallel for30 for (i = 0; i < 16; ++i) {31 if (i == 5)32 goto L1; // expected-error {{use of undeclared label 'L1'}}33 else if (i == 6)34 return; // expected-error {{cannot return from OpenMP region}}35 else if (i == 7)36 goto L2;37 else if (i == 8) {38 L2:39 x[i]++;40 }41 }42 43 if (x[0] == 0)44 goto L2; // expected-error {{use of undeclared label 'L2'}}45 else if (x[1] == 1)46 goto L1;47}48 49void test_invalid_clause(void) {50 int i;51// expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel for' are ignored}}52#pragma omp parallel for foo bar53 for (i = 0; i < 16; ++i)54 ;55}56 57void test_non_identifiers(void) {58 int i, x;59 60// expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel for' are ignored}}61#pragma omp parallel for;62 for (i = 0; i < 16; ++i)63 ;64 65// expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel for' are ignored}}66#pragma omp parallel for private(x);67 for (i = 0; i < 16; ++i)68 ;69 70// expected-warning@+1 {{extra tokens at the end of '#pragma omp parallel for' are ignored}}71#pragma omp parallel for, private(x);72 for (i = 0; i < 16; ++i)73 ;74}75 76extern int foo(void);77 78void test_collapse(void) {79 int i;80// expected-error@+1 {{expected '('}}81#pragma omp parallel for collapse82 for (i = 0; i < 16; ++i)83 ;84// expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}85#pragma omp parallel for collapse(86 for (i = 0; i < 16; ++i)87 ;88// expected-error@+1 {{expected expression}}89#pragma omp parallel for collapse()90 for (i = 0; i < 16; ++i)91 ;92// expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}93#pragma omp parallel for collapse(,94 for (i = 0; i < 16; ++i)95 ;96// expected-error@+1 {{expected expression}} expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}97#pragma omp parallel for collapse(, )98 for (i = 0; i < 16; ++i)99 ;100// expected-warning@+2 {{extra tokens at the end of '#pragma omp parallel for' are ignored}}101// expected-error@+1 {{expected '('}}102#pragma omp parallel for collapse 4)103 for (i = 0; i < 16; ++i)104 ;105// expected-error@+2 {{expected ')'}}106// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}107#pragma omp parallel for collapse(4108 for (i = 0; i < 16; ++i)109 ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}}110// expected-error@+2 {{expected ')'}}111// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}112#pragma omp parallel for collapse(4,113 for (i = 0; i < 16; ++i)114 ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}}115// expected-error@+2 {{expected ')'}}116// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}117#pragma omp parallel for collapse(4, )118 for (i = 0; i < 16; ++i)119 ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}}120// expected-note@+1 {{as specified in 'collapse' clause}}121#pragma omp parallel for collapse(4)122 for (i = 0; i < 16; ++i)123 ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}}124// expected-error@+2 {{expected ')'}}125// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}126#pragma omp parallel for collapse(4 4)127 for (i = 0; i < 16; ++i)128 ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}}129// expected-error@+2 {{expected ')'}}130// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}131#pragma omp parallel for collapse(4, , 4)132 for (i = 0; i < 16; ++i)133 ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}}134#pragma omp parallel for collapse(4)135 for (int i1 = 0; i1 < 16; ++i1)136 for (int i2 = 0; i2 < 16; ++i2)137 for (int i3 = 0; i3 < 16; ++i3)138 for (int i4 = 0; i4 < 16; ++i4)139 foo();140// expected-error@+2 {{expected ')'}}141// expected-note@+1 {{to match this '('}} expected-note@+1 {{as specified in 'collapse' clause}}142#pragma omp parallel for collapse(4, 8)143 for (i = 0; i < 16; ++i)144 ; // expected-error {{expected 4 for loops after '#pragma omp parallel for', but found only 1}}145// expected-error@+1 {{integer constant expression}}146#pragma omp parallel for collapse(2.5)147 for (i = 0; i < 16; ++i)148 ;149// expected-error@+1 {{integer constant expression}}150#pragma omp parallel for collapse(foo())151 for (i = 0; i < 16; ++i)152 ;153// expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}}154#pragma omp parallel for collapse(-5)155 for (i = 0; i < 16; ++i)156 ;157// expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}}158#pragma omp parallel for collapse(0)159 for (i = 0; i < 16; ++i)160 ;161// expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}}162#pragma omp parallel for collapse(5 - 5)163 for (i = 0; i < 16; ++i)164 ;165// expected-note@+1 2 {{defined as firstprivate}}166#pragma omp parallel for collapse(2) firstprivate(i)167 for (i = 0; i < 16; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp parallel for' directive may not be firstprivate, predetermined as private}}168// expected-note@+1 {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp for' directive into a parallel or another task region?}}169 for (int j = 0; j < 16; ++j)170// expected-error@+2 2 {{reduction variable must be shared}}171// expected-error@+1 {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}172#pragma omp for reduction(+ : i, j)173 for (int k = 0; k < 16; ++k)174 i += j;175}176 177void test_private(void) {178 int i;179// expected-error@+2 {{expected expression}}180// expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}181#pragma omp parallel for private(182 for (i = 0; i < 16; ++i)183 ;184// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}185// expected-error@+1 2 {{expected expression}}186#pragma omp parallel for private(,187 for (i = 0; i < 16; ++i)188 ;189// expected-error@+1 2 {{expected expression}}190#pragma omp parallel for private(, )191 for (i = 0; i < 16; ++i)192 ;193// expected-error@+1 {{expected expression}}194#pragma omp parallel for private()195 for (i = 0; i < 16; ++i)196 ;197// expected-error@+1 {{expected expression}}198#pragma omp parallel for private(int)199 for (i = 0; i < 16; ++i)200 ;201// expected-error@+1 {{expected variable name}}202#pragma omp parallel for private(0)203 for (i = 0; i < 16; ++i)204 ;205 206 int x, y, z;207#pragma omp parallel for private(x)208 for (i = 0; i < 16; ++i)209 ;210#pragma omp parallel for private(x, y)211 for (i = 0; i < 16; ++i)212 ;213#pragma omp parallel for private(x, y, z)214 for (i = 0; i < 16; ++i) {215 x = y * i + z;216 }217}218 219void test_lastprivate(void) {220 int i;221// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}222// expected-error@+1 {{expected expression}}223#pragma omp parallel for lastprivate(224 for (i = 0; i < 16; ++i)225 ;226 227// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}228// expected-error@+1 2 {{expected expression}}229#pragma omp parallel for lastprivate(,230 for (i = 0; i < 16; ++i)231 ;232// expected-error@+1 2 {{expected expression}}233#pragma omp parallel for lastprivate(, )234 for (i = 0; i < 16; ++i)235 ;236// expected-error@+1 {{expected expression}}237#pragma omp parallel for lastprivate()238 for (i = 0; i < 16; ++i)239 ;240// expected-error@+1 {{expected expression}}241#pragma omp parallel for lastprivate(int)242 for (i = 0; i < 16; ++i)243 ;244// expected-error@+1 {{expected variable name}}245#pragma omp parallel for lastprivate(0)246 for (i = 0; i < 16; ++i)247 ;248 249 int x, y, z;250#pragma omp parallel for lastprivate(x)251 for (i = 0; i < 16; ++i)252 ;253#pragma omp parallel for lastprivate(x, y)254 for (i = 0; i < 16; ++i)255 ;256#pragma omp parallel for lastprivate(x, y, z)257 for (i = 0; i < 16; ++i)258 ;259}260 261void test_firstprivate(void) {262 int i;263// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}264// expected-error@+1 {{expected expression}}265#pragma omp parallel for firstprivate(266 for (i = 0; i < 16; ++i)267 ;268 269// expected-error@+2 {{expected ')'}} expected-note@+2 {{to match this '('}}270// expected-error@+1 2 {{expected expression}}271#pragma omp parallel for firstprivate(,272 for (i = 0; i < 16; ++i)273 ;274// expected-error@+1 2 {{expected expression}}275#pragma omp parallel for firstprivate(, )276 for (i = 0; i < 16; ++i)277 ;278// expected-error@+1 {{expected expression}}279#pragma omp parallel for firstprivate()280 for (i = 0; i < 16; ++i)281 ;282// expected-error@+1 {{expected expression}}283#pragma omp parallel for firstprivate(int)284 for (i = 0; i < 16; ++i)285 ;286// expected-error@+1 {{expected variable name}}287#pragma omp parallel for firstprivate(0)288 for (i = 0; i < 16; ++i)289 ;290 291 int x, y, z;292#pragma omp parallel for lastprivate(x) firstprivate(x)293 for (i = 0; i < 16; ++i)294 ;295#pragma omp parallel for lastprivate(x, y) firstprivate(x, y)296 for (i = 0; i < 16; ++i)297 ;298#pragma omp parallel for lastprivate(x, y, z) firstprivate(x, y, z)299 for (i = 0; i < 16; ++i)300 ;301}302 303void test_loop_messages(void) {304 float a[100], b[100], c[100];305// expected-error@+2 {{variable must be of integer or pointer type}}306#pragma omp parallel for307 for (float fi = 0; fi < 10.0; fi++) {308 c[(int)fi] = a[(int)fi] + b[(int)fi];309 }310// expected-error@+2 {{variable must be of integer or pointer type}}311#pragma omp parallel for312 for (double fi = 0; fi < 10.0; fi++) {313 c[(int)fi] = a[(int)fi] + b[(int)fi];314 }315}316 317