parallel_for_firstprivate_messages.cpp revision ef8225444452a1486bd721f3285301fe84643b00
16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// RUN: %clang_cc1 -verify -fopenmp=libiomp5 %s 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid foo() { 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgbool foobool(int argc) { 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return argc; 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}} 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgextern S1 a; 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass S2 { 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org mutable int a; 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S2() : a(0) {} 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S2(S2 &s2) : a(s2.a) {} 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static float S2s; 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org static const float S2sc; 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst float S2::S2sc = 0; 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst S2 b; 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst S2 ba[5]; 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass S3 { 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int a; 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S3 &operator=(const S3 &s3); 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S3() : a(0) {} 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S3(S3 &s3) : a(s3.a) {} 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst S3 c; 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst S3 ca[5]; 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgextern const int f; 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass S4 { // expected-note 2 {{'S4' declared here}} 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int a; 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S4(); 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S4(const S4 &s4); 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S4(int v) : a(v) {} 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass S5 { // expected-note 4 {{'S5' declared here}} 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int a; 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S5(const S5 &s5) : a(s5.a) {} 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S5() : a(0) {} 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S5(int v) : a(v) {} 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass S6 { 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int a; 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S6() : a(0) {} 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S6(const S6 &s6) : a(s6.a) {} 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S6(int v) : a(v) {} 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgS3 h; 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}} 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtemplate <class I, class C> 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint foomain(int argc, char **argv) { 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org I e(4); // expected-note {{'e' defined here}} 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org C g(5); // expected-note 2 {{'g' defined here}} 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i; 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int &j = i; // expected-note {{'j' defined here}} 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate // expected-error {{expected '(' after 'firstprivate'}} 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int k = 0; k < argc; ++k) 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++k; 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int k = 0; k < argc; ++k) 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++k; 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate() // expected-error {{expected expression}} 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int k = 0; k < argc; ++k) 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++k; 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int k = 0; k < argc; ++k) 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++k; 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int k = 0; k < argc; ++k) 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++k; 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int k = 0; k < argc; ++k) 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++k; 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(argc) 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int k = 0; k < argc; ++k) 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++k; 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(S1) // expected-error {{'S1' does not refer to a value}} 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int k = 0; k < argc; ++k) 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++k; 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(a, b) // expected-error {{firstprivate variable with incomplete type 'S1'}} 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int k = 0; k < argc; ++k) 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++k; 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(argv[1]) // expected-error {{expected variable name}} 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int k = 0; k < argc; ++k) 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++k; 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(e, g) // expected-error 2 {{firstprivate variable must have an accessible, unambiguous copy constructor}} 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int k = 0; k < argc; ++k) 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++k; 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(h) // expected-error {{threadprivate or thread local variable cannot be firstprivate}} 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int k = 0; k < argc; ++k) 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++k; 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for linear(i) // expected-error {{unexpected OpenMP clause 'linear' in directive '#pragma omp parallel for'}} 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int k = 0; k < argc; ++k) 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++k; 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org { 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int v = 0; 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i; 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(i) 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int k = 0; k < argc; ++k) { 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org i = k; 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org v += i; 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel shared(i) 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel private(i) 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int k = 0; k < argc; ++k) 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++k; 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(i) 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int k = 0; k < argc; ++k) 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ++k; 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for lastprivate(g) firstprivate(g) // expected-error {{firstprivate variable must have an accessible, unambiguous copy constructor}} 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < argc; ++i) 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org foo(); 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel private(i) 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(i) // expected-note {{defined as firstprivate}} 1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp parallel for' directive may not be firstprivate, predetermined as private}} 1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org foo(); 1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel reduction(+ : i) 1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate(i) // expected-note {{defined as firstprivate}} 1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp parallel for' directive may not be firstprivate, predetermined as private}} 1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org foo(); 1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return 0; 1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgint main(int argc, char **argv) { 1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int d = 5; 1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const int da[5] = {0}; 1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S4 e(4); // expected-note {{'e' defined here}} 1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S5 g(5); // expected-note 2 {{'g' defined here}} 1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S3 m; 1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org S6 n(2); 1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int i; 1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int &j = i; // expected-note {{'j' defined here}} 1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate // expected-error {{expected '(' after 'firstprivate'}} 1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < argc; ++i) 1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org foo(); 1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#pragma omp parallel for firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (i = 0; i < argc; ++i) 1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org foo(); 155#pragma omp parallel for firstprivate() // expected-error {{expected expression}} 156 for (i = 0; i < argc; ++i) 157 foo(); 158#pragma omp parallel for firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} 159 for (i = 0; i < argc; ++i) 160 foo(); 161#pragma omp parallel for firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 162 for (i = 0; i < argc; ++i) 163 foo(); 164#pragma omp parallel for firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 165 for (i = 0; i < argc; ++i) 166 foo(); 167#pragma omp parallel for firstprivate(argc) 168 for (i = 0; i < argc; ++i) 169 foo(); 170#pragma omp parallel for firstprivate(S1) // expected-error {{'S1' does not refer to a value}} 171 for (i = 0; i < argc; ++i) 172 foo(); 173#pragma omp parallel for firstprivate(a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}} 174 for (i = 0; i < argc; ++i) 175 foo(); 176#pragma omp parallel for firstprivate(argv[1]) // expected-error {{expected variable name}} 177 for (i = 0; i < argc; ++i) 178 foo(); 179#pragma omp parallel for firstprivate(2 * 2) // expected-error {{expected variable name}} 180 for (i = 0; i < argc; ++i) 181 foo(); 182#pragma omp parallel for firstprivate(ba) // OK 183 for (i = 0; i < argc; ++i) 184 foo(); 185#pragma omp parallel for firstprivate(ca) // OK 186 for (i = 0; i < argc; ++i) 187 foo(); 188#pragma omp parallel for firstprivate(da) // OK 189 for (i = 0; i < argc; ++i) 190 foo(); 191 int xa; 192#pragma omp parallel for firstprivate(xa) // OK 193 for (i = 0; i < argc; ++i) 194 foo(); 195#pragma omp parallel for firstprivate(S2::S2s) // OK 196 for (i = 0; i < argc; ++i) 197 foo(); 198#pragma omp parallel for firstprivate(S2::S2sc) // OK 199 for (i = 0; i < argc; ++i) 200 foo(); 201#pragma omp parallel for safelen(5) // expected-error {{unexpected OpenMP clause 'safelen' in directive '#pragma omp parallel for'}} 202 for (i = 0; i < argc; ++i) 203 foo(); 204#pragma omp parallel for firstprivate(e, g) // expected-error 2 {{firstprivate variable must have an accessible, unambiguous copy constructor}} 205 for (i = 0; i < argc; ++i) 206 foo(); 207#pragma omp parallel for firstprivate(m) // OK 208 for (i = 0; i < argc; ++i) 209 foo(); 210#pragma omp parallel for firstprivate(h) // expected-error {{threadprivate or thread local variable cannot be firstprivate}} 211 for (i = 0; i < argc; ++i) 212 foo(); 213#pragma omp parallel for private(xa), firstprivate(xa) // expected-error {{private variable cannot be firstprivate}} expected-note {{defined as private}} 214 for (i = 0; i < argc; ++i) 215 foo(); 216#pragma omp parallel for firstprivate(i) // expected-note {{defined as firstprivate}} 217 for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp parallel for' directive may not be firstprivate, predetermined as private}} 218 foo(); 219#pragma omp parallel shared(xa) 220#pragma omp parallel for firstprivate(xa) // OK: may be firstprivate 221 for (i = 0; i < argc; ++i) 222 foo(); 223#pragma omp parallel for firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} 224 for (i = 0; i < argc; ++i) 225 foo(); 226#pragma omp parallel for lastprivate(g) firstprivate(g) // expected-error {{firstprivate variable must have an accessible, unambiguous copy constructor}} 227 for (i = 0; i < argc; ++i) 228 foo(); 229#pragma omp parallel for lastprivate(n) firstprivate(n) // OK 230 for (i = 0; i < argc; ++i) 231 foo(); 232#pragma omp parallel 233 { 234 int v = 0; 235 int i; 236#pragma omp parallel for firstprivate(i) 237 for (int k = 0; k < argc; ++k) { 238 i = k; 239 v += i; 240 } 241 } 242#pragma omp parallel private(i) 243#pragma omp parallel for firstprivate(i) // expected-note {{defined as firstprivate}} 244 for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp parallel for' directive may not be firstprivate, predetermined as private}} 245 foo(); 246#pragma omp parallel reduction(+ : i) 247#pragma omp parallel for firstprivate(i) // expected-note {{defined as firstprivate}} 248 for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp parallel for' directive may not be firstprivate, predetermined as private}} 249 foo(); 250 251 return foomain<S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<S4, S5>' requested here}} 252} 253