• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -verify -fopenmp %s
2 
foo()3 void foo() {
4 }
5 
6 struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}} expected-note 1 {{forward declaration of 'S1'}} expected-note {{forward declaration of 'S1'}}
7 extern S1 a;
8 class S2 {
9   mutable int a;
10 
11 public:
S2()12   S2() : a(0) {}
13   static float S2s; // expected-note {{static data member is predetermined as shared}} expected-note 1 {{static data member is predetermined as shared}}
14 };
15 const S2 b;
16 const S2 ba[5];
17 class S3 {
18   int a;
19 
20 public:
S3()21   S3() : a(0) {}
22 };
23 const S3 c; // expected-note {{global variable is predetermined as shared}} expected-note 1 {{global variable is predetermined as shared}}
24 const S3 ca[5]; // expected-note {{global variable is predetermined as shared}} expected-note 1 {{global variable is predetermined as shared}}
25 extern const int f; // expected-note {{global variable is predetermined as shared}} expected-note 1 {{global variable is predetermined as shared}}
26 
27 int threadvar;
28 #pragma omp threadprivate(threadvar) // expected-note {{defined as threadprivate or thread local}} expected-note 1 {{defined as threadprivate or thread local}}
29 
30 class S4 {
31   int a;
32   S4(); // expected-note {{implicitly declared private here}} expected-note 1 {{implicitly declared private here}}
33 
34 public:
S4(int v)35   S4(int v) : a(v) {}
36 };
37 class S5 {
38   int a;
S5()39   S5() : a(0) {} // expected-note {{implicitly declared private here}} expected-note 1 {{implicitly declared private here}}
40 
41 public:
S5(int v)42   S5(int v) : a(v) {}
43 };
44 namespace A {
45 double x;
46 #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}} expected-note 1 {{defined as threadprivate or thread local}} expected-note 2 {{defined as threadprivate or thread local}}
47 }
48 namespace B {
49 using A::x;
50 }
51 
52 S3 h;
53 #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
54 
55 template <class I, class C, class D, class E>
foomain(I argc,C ** argv)56 int foomain(I argc, C **argv) {
57   const I d = 5; // expected-note {{constant variable is predetermined as shared}}
58   const I da[5] = { 0 }; // expected-note {{constant variable is predetermined as shared}}
59   D e(4);
60   E g[] = {5, 6};
61   I i;
62   I &j = i;
63 #pragma omp target parallel private // expected-error {{expected '(' after 'private'}}
64 {}
65 #pragma omp target parallel private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
66 {}
67 #pragma omp target parallel private() // expected-error {{expected expression}}
68 {}
69 #pragma omp target parallel private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
70 {}
71 #pragma omp target parallel private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
72 {}
73 #pragma omp target parallel private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
74 {}
75 #pragma omp target parallel private(argc argv) // expected-error {{expected ',' or ')' in 'private' clause}}
76 {}
77 #pragma omp target parallel private(argc)
78 {}
79 #pragma omp target parallel private(S1) // expected-error {{'S1' does not refer to a value}}
80 {}
81 #pragma omp target parallel private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
82 {}
83 #pragma omp target parallel private (a, b, c, d, f) // expected-error {{a private variable with incomplete type 'S1'}} expected-error 3 {{shared variable cannot be private}}
84 {}
85 #pragma omp target parallel private(argv[1]) // expected-error {{expected variable name}}
86 {}
87 #pragma omp target parallel private(ba)
88 {}
89 #pragma omp target parallel private(ca) // expected-error {{shared variable cannot be private}}
90 {}
91 #pragma omp target parallel private(da) // expected-error {{shared variable cannot be private}}
92 {}
93 #pragma omp target parallel private(S2::S2s) // expected-error {{shared variable cannot be private}}
94 {}
95 #pragma omp target parallel private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
96 {}
97   #pragma omp target parallel private(threadvar, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}}
98   {}
99   #pragma omp target parallel shared(i), private(i) // expected-error {{shared variable cannot be private}} expected-note {{defined as shared}}
100   foo();
101   #pragma omp target parallel firstprivate(i) private(i) // expected-error {{firstprivate variable cannot be private}} expected-note {{defined as firstprivate}}
102   foo();
103   #pragma omp target parallel private(i)
104   {}
105   #pragma omp target parallel private(j)
106   foo();
107   #pragma omp parallel firstprivate(i)
108   for (int k = 0; k < 10; ++k) {
109     #pragma omp target parallel private(i)
110     foo();
111   }
112   static int m;
113   #pragma omp target parallel private(m) // OK
114   foo();
115 #pragma omp target parallel private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
116 {}
117 #pragma omp target parallel private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}}
118 #pragma omp parallel
119   {
120     int v = 0;
121     int i;
122   }
123 #pragma omp target parallel shared(i)
124 {}
125 #pragma omp target parallel private(i)
126 {}
127 #pragma omp target parallel private(j)
128 {}
129 #pragma omp target parallel private(i)
130 {}
131   static int si;
132 #pragma omp target parallel private(si) // OK
133   {}
134   return 0;
135 }
136 
bar(S4 a[2])137 void bar(S4 a[2]) {
138 #pragma omp parallel
139 #pragma omp target parallel private(a)
140   {}
141 }
142 
main(int argc,char ** argv)143 int main(int argc, char **argv) {
144   const int d = 5; // expected-note {{constant variable is predetermined as shared}}
145   const int da[5] = { 0 }; // expected-note {{constant variable is predetermined as shared}}
146   S4 e(4);
147   S5 g[] = {5, 6};
148   int i;
149   int &j = i;
150 #pragma omp target parallel private // expected-error {{expected '(' after 'private'}}
151 {}
152 #pragma omp target parallel private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
153 {}
154 #pragma omp target parallel private() // expected-error {{expected expression}}
155 {}
156 #pragma omp target parallel private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
157 {}
158 #pragma omp target parallel private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
159 {}
160 #pragma omp target parallel private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
161 {}
162 #pragma omp target parallel private(argc argv) // expected-error {{expected ',' or ')' in 'private' clause}}
163 {}
164 #pragma omp target parallel private(argc)
165 {}
166 #pragma omp target parallel private(S1) // expected-error {{'S1' does not refer to a value}}
167 {}
168 #pragma omp target parallel private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
169 {}
170 #pragma omp target parallel private (a, b, c, d, f) // expected-error {{a private variable with incomplete type 'S1'}} expected-error 3 {{shared variable cannot be private}}
171 {}
172 #pragma omp target parallel private(argv[1]) // expected-error {{expected variable name}}
173 {}
174 #pragma omp target parallel private(ba)
175 {}
176 #pragma omp target parallel private(ca) // expected-error {{shared variable cannot be private}}
177 {}
178 #pragma omp target parallel private(da) // expected-error {{shared variable cannot be private}}
179 {}
180 #pragma omp target parallel private(S2::S2s) // expected-error {{shared variable cannot be private}}
181 {}
182 #pragma omp target parallel private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
183 {}
184   #pragma omp target parallel private(threadvar, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}}
185   {}
186   #pragma omp target parallel shared(i), private(i) // expected-error {{shared variable cannot be private}} expected-note {{defined as shared}}
187   foo();
188   #pragma omp target parallel firstprivate(i) private(i) // expected-error {{firstprivate variable cannot be private}} expected-note {{defined as firstprivate}}
189   foo();
190   #pragma omp target parallel private(i)
191   {}
192   #pragma omp target parallel private(j)
193   foo();
194   #pragma omp parallel firstprivate(i)
195   for (int k = 0; k < 10; ++k) {
196     #pragma omp target parallel private(i)
197     foo();
198   }
199   static int m;
200   #pragma omp target parallel private(m) // OK
201   foo();
202 #pragma omp target parallel private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
203 {}
204 #pragma omp target parallel private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}}
205 #pragma omp parallel
206   {
207     int i;
208   }
209 #pragma omp target parallel shared(i)
210 {}
211 #pragma omp target parallel private(i)
212 {}
213 #pragma omp target parallel private(j)
214 {}
215 #pragma omp target parallel private(i)
216 {}
217   static int si;
218 #pragma omp target parallel private(si) // OK
219   {}
220   return foomain<int, char, S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char, S4, S5>' requested here}}
221 }
222 
223