1a914888bSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp %s -Wuninitialized
284d0b3efSAlexey Bataev
3a914888bSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized
4a8a9153aSAlexey Bataev
5e04483eeSAlexey Bataev extern int omp_default_mem_alloc;
foo()684d0b3efSAlexey Bataev void foo() {
784d0b3efSAlexey Bataev }
884d0b3efSAlexey Bataev
foobool(int argc)984d0b3efSAlexey Bataev bool foobool(int argc) {
1084d0b3efSAlexey Bataev return argc;
1184d0b3efSAlexey Bataev }
1284d0b3efSAlexey Bataev
xxx(int argc)13*25569296SAlexey Bataev void xxx(int argc) {
14*25569296SAlexey Bataev int fp; // expected-note {{initialize the variable 'fp' to silence this warning}}
15*25569296SAlexey Bataev #pragma omp parallel sections firstprivate(fp) // expected-warning {{variable 'fp' is uninitialized when used here}}
16*25569296SAlexey Bataev {
17*25569296SAlexey Bataev for (int i = 0; i < 10; ++i)
18*25569296SAlexey Bataev ;
19*25569296SAlexey Bataev }
20*25569296SAlexey Bataev }
21*25569296SAlexey Bataev
2284d0b3efSAlexey Bataev struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}
2384d0b3efSAlexey Bataev extern S1 a;
2484d0b3efSAlexey Bataev class S2 {
2584d0b3efSAlexey Bataev mutable int a;
2684d0b3efSAlexey Bataev
2784d0b3efSAlexey Bataev public:
S2()2884d0b3efSAlexey Bataev S2() : a(0) {}
S2(const S2 & s2)294a5bb772SAlexey Bataev S2(const S2 &s2) : a(s2.a) {}
3084d0b3efSAlexey Bataev static float S2s;
3184d0b3efSAlexey Bataev static const float S2sc;
3284d0b3efSAlexey Bataev };
3384d0b3efSAlexey Bataev const float S2::S2sc = 0;
3484d0b3efSAlexey Bataev const S2 b;
3584d0b3efSAlexey Bataev const S2 ba[5];
3684d0b3efSAlexey Bataev class S3 {
3784d0b3efSAlexey Bataev int a;
3884d0b3efSAlexey Bataev S3 &operator=(const S3 &s3);
3984d0b3efSAlexey Bataev
4084d0b3efSAlexey Bataev public:
S3()4184d0b3efSAlexey Bataev S3() : a(0) {}
S3(const S3 & s3)424a5bb772SAlexey Bataev S3(const S3 &s3) : a(s3.a) {}
4384d0b3efSAlexey Bataev };
4484d0b3efSAlexey Bataev const S3 c;
4584d0b3efSAlexey Bataev const S3 ca[5];
4684d0b3efSAlexey Bataev extern const int f;
474a5bb772SAlexey Bataev class S4 {
4884d0b3efSAlexey Bataev int a;
4984d0b3efSAlexey Bataev S4();
504a5bb772SAlexey Bataev S4(const S4 &s4); // expected-note 2 {{implicitly declared private here}}
5184d0b3efSAlexey Bataev
5284d0b3efSAlexey Bataev public:
S4(int v)5384d0b3efSAlexey Bataev S4(int v) : a(v) {}
5484d0b3efSAlexey Bataev };
554a5bb772SAlexey Bataev class S5 {
5684d0b3efSAlexey Bataev int a;
S5(const S5 & s5)574a5bb772SAlexey Bataev S5(const S5 &s5) : a(s5.a) {} // expected-note 4 {{implicitly declared private here}}
5884d0b3efSAlexey Bataev
5984d0b3efSAlexey Bataev public:
S5()6084d0b3efSAlexey Bataev S5() : a(0) {}
S5(int v)6184d0b3efSAlexey Bataev S5(int v) : a(v) {}
6284d0b3efSAlexey Bataev };
6384d0b3efSAlexey Bataev class S6 {
6484d0b3efSAlexey Bataev int a;
S6()6584d0b3efSAlexey Bataev S6() : a(0) {}
6684d0b3efSAlexey Bataev
6784d0b3efSAlexey Bataev public:
S6(const S6 & s6)6884d0b3efSAlexey Bataev S6(const S6 &s6) : a(s6.a) {}
S6(int v)6984d0b3efSAlexey Bataev S6(int v) : a(v) {}
7084d0b3efSAlexey Bataev };
7184d0b3efSAlexey Bataev
7284d0b3efSAlexey Bataev S3 h;
7384d0b3efSAlexey Bataev #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
7484d0b3efSAlexey Bataev
7584d0b3efSAlexey Bataev template <class I, class C>
foomain(int argc,char ** argv)7684d0b3efSAlexey Bataev int foomain(int argc, char **argv) {
774a5bb772SAlexey Bataev I e(4);
784a5bb772SAlexey Bataev C g(5);
79a914888bSAlexey Bataev int i, z;
80bd9fec1eSAlexey Bataev int &j = i;
8184d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate // expected-error {{expected '(' after 'firstprivate'}}
8284d0b3efSAlexey Bataev {
8384d0b3efSAlexey Bataev foo();
8484d0b3efSAlexey Bataev }
8584d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
8684d0b3efSAlexey Bataev {
8784d0b3efSAlexey Bataev foo();
8884d0b3efSAlexey Bataev }
8984d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate() // expected-error {{expected expression}}
9084d0b3efSAlexey Bataev {
9184d0b3efSAlexey Bataev foo();
9284d0b3efSAlexey Bataev }
9384d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
9484d0b3efSAlexey Bataev {
9584d0b3efSAlexey Bataev foo();
9684d0b3efSAlexey Bataev }
97c5970623SAlexey Bataev #pragma omp parallel sections firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
9884d0b3efSAlexey Bataev {
9984d0b3efSAlexey Bataev foo();
10084d0b3efSAlexey Bataev }
10184d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
10284d0b3efSAlexey Bataev {
10384d0b3efSAlexey Bataev foo();
10484d0b3efSAlexey Bataev }
105e04483eeSAlexey Bataev #pragma omp parallel sections firstprivate(argc) allocate , allocate(, allocate(omp_default , allocate(omp_default_mem_alloc, allocate(omp_default_mem_alloc:, allocate(omp_default_mem_alloc: argc, allocate(omp_default_mem_alloc: argv), allocate(argv) // expected-error {{expected '(' after 'allocate'}} expected-error 2 {{expected expression}} expected-error 2 {{expected ')'}} expected-error {{use of undeclared identifier 'omp_default'}} expected-note 2 {{to match this '('}}
10684d0b3efSAlexey Bataev {
10784d0b3efSAlexey Bataev foo();
10884d0b3efSAlexey Bataev }
10984d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(S1) // expected-error {{'S1' does not refer to a value}}
11084d0b3efSAlexey Bataev {
11184d0b3efSAlexey Bataev foo();
11284d0b3efSAlexey Bataev }
113a914888bSAlexey Bataev #pragma omp parallel sections firstprivate(z, a, b) // expected-error {{firstprivate variable with incomplete type 'S1'}}
11484d0b3efSAlexey Bataev {
11584d0b3efSAlexey Bataev foo();
11684d0b3efSAlexey Bataev }
11784d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(argv[1]) // expected-error {{expected variable name}}
11884d0b3efSAlexey Bataev {
11984d0b3efSAlexey Bataev foo();
12084d0b3efSAlexey Bataev }
1214a5bb772SAlexey Bataev #pragma omp parallel sections firstprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
12284d0b3efSAlexey Bataev {
12384d0b3efSAlexey Bataev foo();
12484d0b3efSAlexey Bataev }
12584d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(h) // expected-error {{threadprivate or thread local variable cannot be firstprivate}}
12684d0b3efSAlexey Bataev {
12784d0b3efSAlexey Bataev foo();
12884d0b3efSAlexey Bataev }
12984d0b3efSAlexey Bataev #pragma omp parallel sections linear(i) // expected-error {{unexpected OpenMP clause 'linear' in directive '#pragma omp parallel sections'}}
13084d0b3efSAlexey Bataev {
13184d0b3efSAlexey Bataev foo();
13284d0b3efSAlexey Bataev }
13384d0b3efSAlexey Bataev #pragma omp parallel
13484d0b3efSAlexey Bataev {
13584d0b3efSAlexey Bataev int v = 0;
13684d0b3efSAlexey Bataev int i;
13784d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(i)
13884d0b3efSAlexey Bataev {
13984d0b3efSAlexey Bataev foo();
14084d0b3efSAlexey Bataev }
14184d0b3efSAlexey Bataev v += i;
14284d0b3efSAlexey Bataev }
14384d0b3efSAlexey Bataev #pragma omp parallel shared(i)
14484d0b3efSAlexey Bataev #pragma omp parallel private(i)
145bd9fec1eSAlexey Bataev #pragma omp parallel sections firstprivate(j)
14684d0b3efSAlexey Bataev {
14784d0b3efSAlexey Bataev foo();
14884d0b3efSAlexey Bataev }
14984d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(i)
15084d0b3efSAlexey Bataev {
15184d0b3efSAlexey Bataev foo();
15284d0b3efSAlexey Bataev }
1534a5bb772SAlexey Bataev #pragma omp parallel sections lastprivate(g) firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}}
15484d0b3efSAlexey Bataev {
15584d0b3efSAlexey Bataev foo();
15684d0b3efSAlexey Bataev }
15784d0b3efSAlexey Bataev #pragma omp parallel private(i)
15884d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(i)
15984d0b3efSAlexey Bataev {
16084d0b3efSAlexey Bataev foo();
16184d0b3efSAlexey Bataev }
16284d0b3efSAlexey Bataev #pragma omp parallel reduction(+ : i)
16384d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(i)
16484d0b3efSAlexey Bataev {
16584d0b3efSAlexey Bataev foo();
16684d0b3efSAlexey Bataev }
16784d0b3efSAlexey Bataev return 0;
16884d0b3efSAlexey Bataev }
16984d0b3efSAlexey Bataev
1706ddfe1a6SAlexey Bataev namespace A {
1716ddfe1a6SAlexey Bataev double x;
1726ddfe1a6SAlexey Bataev #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
1736ddfe1a6SAlexey Bataev }
1746ddfe1a6SAlexey Bataev namespace B {
1756ddfe1a6SAlexey Bataev using A::x;
1766ddfe1a6SAlexey Bataev }
1776ddfe1a6SAlexey Bataev
main(int argc,char ** argv)17884d0b3efSAlexey Bataev int main(int argc, char **argv) {
17984d0b3efSAlexey Bataev const int d = 5;
18084d0b3efSAlexey Bataev const int da[5] = {0};
1814a5bb772SAlexey Bataev S4 e(4);
1824a5bb772SAlexey Bataev S5 g(5);
18384d0b3efSAlexey Bataev S3 m;
18484d0b3efSAlexey Bataev S6 n(2);
185a914888bSAlexey Bataev int i, z;
186bd9fec1eSAlexey Bataev int &j = i;
18784d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate // expected-error {{expected '(' after 'firstprivate'}}
18884d0b3efSAlexey Bataev {
18984d0b3efSAlexey Bataev foo();
19084d0b3efSAlexey Bataev }
19184d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
19284d0b3efSAlexey Bataev {
19384d0b3efSAlexey Bataev foo();
19484d0b3efSAlexey Bataev }
19584d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate() // expected-error {{expected expression}}
19684d0b3efSAlexey Bataev {
19784d0b3efSAlexey Bataev foo();
19884d0b3efSAlexey Bataev }
19984d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
20084d0b3efSAlexey Bataev {
20184d0b3efSAlexey Bataev foo();
20284d0b3efSAlexey Bataev }
203c5970623SAlexey Bataev #pragma omp parallel sections firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
20484d0b3efSAlexey Bataev {
20584d0b3efSAlexey Bataev foo();
20684d0b3efSAlexey Bataev }
20784d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
20884d0b3efSAlexey Bataev {
20984d0b3efSAlexey Bataev foo();
21084d0b3efSAlexey Bataev }
211a914888bSAlexey Bataev #pragma omp parallel sections firstprivate(argc, z)
21284d0b3efSAlexey Bataev {
21384d0b3efSAlexey Bataev foo();
21484d0b3efSAlexey Bataev }
21584d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(S1) // expected-error {{'S1' does not refer to a value}}
21684d0b3efSAlexey Bataev {
21784d0b3efSAlexey Bataev foo();
21884d0b3efSAlexey Bataev }
21984d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}}
22084d0b3efSAlexey Bataev {
22184d0b3efSAlexey Bataev foo();
22284d0b3efSAlexey Bataev }
22384d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(argv[1]) // expected-error {{expected variable name}}
22484d0b3efSAlexey Bataev {
22584d0b3efSAlexey Bataev foo();
22684d0b3efSAlexey Bataev }
22784d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(2 * 2) // expected-error {{expected variable name}}
22884d0b3efSAlexey Bataev {
22984d0b3efSAlexey Bataev foo();
23084d0b3efSAlexey Bataev }
23184d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(ba) // OK
23284d0b3efSAlexey Bataev {
23384d0b3efSAlexey Bataev foo();
23484d0b3efSAlexey Bataev }
23584d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(ca) // OK
23684d0b3efSAlexey Bataev {
23784d0b3efSAlexey Bataev foo();
23884d0b3efSAlexey Bataev }
23984d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(da) // OK
24084d0b3efSAlexey Bataev {
24184d0b3efSAlexey Bataev foo();
24284d0b3efSAlexey Bataev }
24384d0b3efSAlexey Bataev int xa;
24484d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(xa) // OK
24584d0b3efSAlexey Bataev {
24684d0b3efSAlexey Bataev foo();
24784d0b3efSAlexey Bataev }
24884d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(S2::S2s) // OK
24984d0b3efSAlexey Bataev {
25084d0b3efSAlexey Bataev foo();
25184d0b3efSAlexey Bataev }
25284d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(S2::S2sc) // OK
25384d0b3efSAlexey Bataev {
25484d0b3efSAlexey Bataev foo();
25584d0b3efSAlexey Bataev }
25684d0b3efSAlexey Bataev #pragma omp parallel sections safelen(5) // expected-error {{unexpected OpenMP clause 'safelen' in directive '#pragma omp parallel sections'}}
25784d0b3efSAlexey Bataev {
25884d0b3efSAlexey Bataev foo();
25984d0b3efSAlexey Bataev }
2604a5bb772SAlexey Bataev #pragma omp parallel sections firstprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
26184d0b3efSAlexey Bataev {
26284d0b3efSAlexey Bataev foo();
26384d0b3efSAlexey Bataev }
26484d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(m) // OK
26584d0b3efSAlexey Bataev {
26684d0b3efSAlexey Bataev foo();
26784d0b3efSAlexey Bataev }
2686ddfe1a6SAlexey Bataev #pragma omp parallel sections firstprivate(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be firstprivate}}
26984d0b3efSAlexey Bataev {
27084d0b3efSAlexey Bataev foo();
27184d0b3efSAlexey Bataev }
27284d0b3efSAlexey Bataev #pragma omp parallel sections private(xa), firstprivate(xa) // expected-error {{private variable cannot be firstprivate}} expected-note {{defined as private}}
27384d0b3efSAlexey Bataev {
27484d0b3efSAlexey Bataev foo();
27584d0b3efSAlexey Bataev }
27684d0b3efSAlexey Bataev #pragma omp parallel shared(xa)
27784d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(xa) // OK: may be firstprivate
27884d0b3efSAlexey Bataev {
27984d0b3efSAlexey Bataev foo();
28084d0b3efSAlexey Bataev }
281bd9fec1eSAlexey Bataev #pragma omp parallel sections firstprivate(j)
28284d0b3efSAlexey Bataev {
28384d0b3efSAlexey Bataev foo();
28484d0b3efSAlexey Bataev }
2854a5bb772SAlexey Bataev #pragma omp parallel sections lastprivate(g) firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}}
28684d0b3efSAlexey Bataev {
28784d0b3efSAlexey Bataev foo();
28884d0b3efSAlexey Bataev }
28984d0b3efSAlexey Bataev #pragma omp parallel sections lastprivate(n) firstprivate(n) // OK
29084d0b3efSAlexey Bataev {
29184d0b3efSAlexey Bataev foo();
29284d0b3efSAlexey Bataev }
29384d0b3efSAlexey Bataev #pragma omp parallel
29484d0b3efSAlexey Bataev {
29584d0b3efSAlexey Bataev int v = 0;
29684d0b3efSAlexey Bataev int i;
29784d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(i)
29884d0b3efSAlexey Bataev {
29984d0b3efSAlexey Bataev foo();
30084d0b3efSAlexey Bataev }
30184d0b3efSAlexey Bataev v += i;
30284d0b3efSAlexey Bataev }
30384d0b3efSAlexey Bataev #pragma omp parallel private(i)
30484d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(i)
30584d0b3efSAlexey Bataev {
30684d0b3efSAlexey Bataev foo();
30784d0b3efSAlexey Bataev }
30884d0b3efSAlexey Bataev #pragma omp parallel reduction(+ : i)
30984d0b3efSAlexey Bataev #pragma omp parallel sections firstprivate(i)
31084d0b3efSAlexey Bataev {
31184d0b3efSAlexey Bataev foo();
31284d0b3efSAlexey Bataev }
3134eea8c6bSKelvin Li static int r;
3144eea8c6bSKelvin Li #pragma omp parallel sections firstprivate(r) // OK
3154eea8c6bSKelvin Li {
3164eea8c6bSKelvin Li foo();
3174eea8c6bSKelvin Li }
31884d0b3efSAlexey Bataev
31984d0b3efSAlexey Bataev return foomain<S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<S4, S5>' requested here}}
32084d0b3efSAlexey Bataev }
321