xref: /llvm-project/clang/test/OpenMP/parallel_master_shared_messages.cpp (revision 47d6094d7fd463707598a0e65dd44a0d1cc279eb)
1*47d6094dScchen // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 %s -Wuninitialized
2*47d6094dScchen 
3*47d6094dScchen // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 %s -Wuninitialized
4*47d6094dScchen 
foo()5*47d6094dScchen void foo() {
6*47d6094dScchen }
7*47d6094dScchen 
foobool(int argc)8*47d6094dScchen bool foobool(int argc) {
9*47d6094dScchen   return argc;
10*47d6094dScchen }
11*47d6094dScchen 
12*47d6094dScchen struct S1; // expected-note {{declared here}}
13*47d6094dScchen extern S1 a;
14*47d6094dScchen class S2 {
15*47d6094dScchen   mutable int a;
16*47d6094dScchen 
17*47d6094dScchen public:
S2()18*47d6094dScchen   S2() : a(0) {}
S2(S2 & s2)19*47d6094dScchen   S2(S2 &s2) : a(s2.a) {}
20*47d6094dScchen };
21*47d6094dScchen const S2 b;
22*47d6094dScchen const S2 ba[5];
23*47d6094dScchen class S3 {
24*47d6094dScchen   int a;
25*47d6094dScchen 
26*47d6094dScchen public:
S3()27*47d6094dScchen   S3() : a(0) {}
S3(S3 & s3)28*47d6094dScchen   S3(S3 &s3) : a(s3.a) {}
29*47d6094dScchen };
30*47d6094dScchen const S3 c;
31*47d6094dScchen const S3 ca[5];
32*47d6094dScchen extern const int f;
33*47d6094dScchen class S4 {
34*47d6094dScchen   int a;
35*47d6094dScchen   S4();
36*47d6094dScchen   S4(const S4 &s4);
37*47d6094dScchen 
38*47d6094dScchen public:
S4(int v)39*47d6094dScchen   S4(int v) : a(v) {}
40*47d6094dScchen };
41*47d6094dScchen class S5 {
42*47d6094dScchen   int a;
S5()43*47d6094dScchen   S5() : a(0) {}
S5(const S5 & s5)44*47d6094dScchen   S5(const S5 &s5) : a(s5.a) {}
45*47d6094dScchen 
46*47d6094dScchen public:
S5(int v)47*47d6094dScchen   S5(int v) : a(v) {}
48*47d6094dScchen };
49*47d6094dScchen 
50*47d6094dScchen S3 h;
51*47d6094dScchen #pragma omp threadprivate(h) // expected-note {{defined as threadprivate or thread local}}
52*47d6094dScchen 
53*47d6094dScchen namespace A {
54*47d6094dScchen double x;
55*47d6094dScchen #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
56*47d6094dScchen }
57*47d6094dScchen namespace B {
58*47d6094dScchen using A::x;
59*47d6094dScchen }
60*47d6094dScchen 
main(int argc,char ** argv)61*47d6094dScchen int main(int argc, char **argv) {
62*47d6094dScchen   const int d = 5;
63*47d6094dScchen   const int da[5] = {0};
64*47d6094dScchen   S4 e(4);
65*47d6094dScchen   S5 g(5);
66*47d6094dScchen   int i, k;
67*47d6094dScchen   int &j = i;
68*47d6094dScchen #pragma omp parallel master shared // expected-error {{expected '(' after 'shared'}}
69*47d6094dScchen   { foo(); }
70*47d6094dScchen #pragma omp parallel master shared( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
71*47d6094dScchen   { foo(); }
72*47d6094dScchen #pragma omp parallel master shared() // expected-error {{expected expression}}
73*47d6094dScchen   { foo(); }
74*47d6094dScchen #pragma omp parallel master shared(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
75*47d6094dScchen   { foo(); }
76*47d6094dScchen #pragma omp parallel master shared(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
77*47d6094dScchen   { foo(); }
78*47d6094dScchen #pragma omp parallel master shared(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
79*47d6094dScchen   { foo(); }
80*47d6094dScchen #pragma omp parallel master shared(argc)
81*47d6094dScchen   { foo(); }
82*47d6094dScchen #pragma omp parallel master shared(S1) // expected-error {{'S1' does not refer to a value}}
83*47d6094dScchen   { foo(); }
84*47d6094dScchen #pragma omp parallel master shared(a, b, c, d, f, k)
85*47d6094dScchen   { foo(); }
86*47d6094dScchen #pragma omp parallel master shared(argv[1]) // expected-error {{expected variable name}}
87*47d6094dScchen   { foo(); }
88*47d6094dScchen #pragma omp parallel master shared(ba)
89*47d6094dScchen   { foo(); }
90*47d6094dScchen #pragma omp parallel master shared(ca)
91*47d6094dScchen   { foo(); }
92*47d6094dScchen #pragma omp parallel master shared(da)
93*47d6094dScchen   { foo(); }
94*47d6094dScchen #pragma omp parallel master shared(e, g)
95*47d6094dScchen   { foo(); }
96*47d6094dScchen #pragma omp parallel master shared(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be shared}}
97*47d6094dScchen   { foo(); }
98*47d6094dScchen #pragma omp parallel master private(i), shared(i) // expected-error {{private variable cannot be shared}} expected-note {{defined as private}}
99*47d6094dScchen   { foo(); }
100*47d6094dScchen #pragma omp parallel master firstprivate(i), shared(i) // expected-error {{firstprivate variable cannot be shared}} expected-note {{defined as firstprivate}}
101*47d6094dScchen   { foo(); }
102*47d6094dScchen #pragma omp parallel master private(i)
103*47d6094dScchen   {
104*47d6094dScchen #pragma omp parallel master shared(i)
105*47d6094dScchen     {
106*47d6094dScchen #pragma omp parallel master shared(j)
107*47d6094dScchen       { foo(); }
108*47d6094dScchen     }
109*47d6094dScchen   }
110*47d6094dScchen #pragma omp parallel master firstprivate(i)
111*47d6094dScchen   {
112*47d6094dScchen #pragma omp parallel master shared(i)
113*47d6094dScchen     {
114*47d6094dScchen #pragma omp parallel master shared(j)
115*47d6094dScchen       { foo(); }
116*47d6094dScchen     }
117*47d6094dScchen   }
118*47d6094dScchen 
119*47d6094dScchen   return 0;
120*47d6094dScchen }
121