xref: /llvm-project/clang/test/OpenMP/target_parallel_private_messages.cpp (revision e955b3d3fe12a05e7639aa336d6945fa9427c0dc)
1 // RUN: %clang_cc1 -verify -fopenmp %s
2 
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:
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:
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:
35   S4(int v) : a(v) {}
36 };
37 class S5 {
38   int a;
39   S5() : a(0) {} // expected-note {{implicitly declared private here}} expected-note 1 {{implicitly declared private here}}
40 
41 public:
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>
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 #pragma omp target parallel private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
65 #pragma omp target parallel private() // expected-error {{expected expression}}
66 #pragma omp target parallel private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
67 #pragma omp target parallel private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
68 #pragma omp target parallel private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
69 #pragma omp target parallel private(argc argv) // expected-error {{expected ',' or ')' in 'private' clause}}
70 #pragma omp target parallel private(argc)
71 #pragma omp target parallel private(S1) // expected-error {{'S1' does not refer to a value}}
72 #pragma omp target parallel private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
73 #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}}
74 #pragma omp target parallel private(argv[1]) // expected-error {{expected variable name}}
75 #pragma omp target parallel private(ba)
76 #pragma omp target parallel private(ca) // expected-error {{shared variable cannot be private}}
77 #pragma omp target parallel private(da) // expected-error {{shared variable cannot be private}}
78 #pragma omp target parallel private(S2::S2s) // expected-error {{shared variable cannot be private}}
79 #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'}}
80   #pragma omp target parallel private(threadvar, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}}
81   #pragma omp target parallel shared(i), private(i) // expected-error {{shared variable cannot be private}} expected-note {{defined as shared}}
82   foo();
83   #pragma omp target parallel firstprivate(i) private(i) // expected-error {{firstprivate variable cannot be private}} expected-note {{defined as firstprivate}}
84   foo();
85   #pragma omp target parallel private(i)
86   #pragma omp target parallel private(j)
87   foo();
88   #pragma omp parallel firstprivate(i)
89   for (int k = 0; k < 10; ++k) {
90     #pragma omp target parallel private(i)
91     foo();
92   }
93   static int m;
94   #pragma omp target parallel private(m) // OK
95   foo();
96 #pragma omp target parallel private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
97 #pragma omp target parallel private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}}
98 #pragma omp parallel
99   {
100     int v = 0;
101     int i;
102 #pragma omp target parallel private(i)
103     {}
104   }
105 #pragma omp target parallel shared(i)
106 #pragma omp target parallel private(i)
107 #pragma omp target parallel private(j)
108 #pragma omp target parallel private(i)
109   {}
110   static int si;
111 #pragma omp target parallel private(si) // OK
112   {}
113   return 0;
114 }
115 
116 void bar(S4 a[2]) {
117 #pragma omp parallel
118 #pragma omp target parallel private(a)
119   {}
120 }
121 
122 int main(int argc, char **argv) {
123   const int d = 5; // expected-note {{constant variable is predetermined as shared}}
124   const int da[5] = { 0 }; // expected-note {{constant variable is predetermined as shared}}
125   S4 e(4);
126   S5 g[] = {5, 6};
127   int i;
128   int &j = i;
129 #pragma omp target parallel private // expected-error {{expected '(' after 'private'}}
130 #pragma omp target parallel private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
131 #pragma omp target parallel private() // expected-error {{expected expression}}
132 #pragma omp target parallel private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
133 #pragma omp target parallel private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
134 #pragma omp target parallel private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
135 #pragma omp target parallel private(argc argv) // expected-error {{expected ',' or ')' in 'private' clause}}
136 #pragma omp target parallel private(argc)
137 #pragma omp target parallel private(S1) // expected-error {{'S1' does not refer to a value}}
138 #pragma omp target parallel private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
139 #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}}
140 #pragma omp target parallel private(argv[1]) // expected-error {{expected variable name}}
141 #pragma omp target parallel private(ba)
142 #pragma omp target parallel private(ca) // expected-error {{shared variable cannot be private}}
143 #pragma omp target parallel private(da) // expected-error {{shared variable cannot be private}}
144 #pragma omp target parallel private(S2::S2s) // expected-error {{shared variable cannot be private}}
145 #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'}}
146   #pragma omp target parallel private(threadvar, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}}
147   #pragma omp target parallel shared(i), private(i) // expected-error {{shared variable cannot be private}} expected-note {{defined as shared}}
148   foo();
149   #pragma omp target parallel firstprivate(i) private(i) // expected-error {{firstprivate variable cannot be private}} expected-note {{defined as firstprivate}}
150   foo();
151   #pragma omp target parallel private(i)
152   #pragma omp target parallel private(j)
153   foo();
154   #pragma omp parallel firstprivate(i)
155   for (int k = 0; k < 10; ++k) {
156     #pragma omp target parallel private(i)
157     foo();
158   }
159   static int m;
160   #pragma omp target parallel private(m) // OK
161   foo();
162 #pragma omp target parallel private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
163 #pragma omp target parallel private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}}
164 #pragma omp parallel
165   {
166     int i;
167 #pragma omp target parallel private(i)
168     {}
169   }
170 #pragma omp target parallel shared(i)
171 #pragma omp target parallel private(i)
172 #pragma omp target parallel private(j)
173 #pragma omp target parallel private(i)
174   {}
175   static int si;
176 #pragma omp target parallel private(si) // OK
177   {}
178   return foomain<int, char, S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char, S4, S5>' requested here}}
179 }
180 
181