xref: /aosp_15_r20/external/clang/test/OpenMP/distribute_firstprivate_messages.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp %s
2*67e74705SXin Li 
foo()3*67e74705SXin Li void foo() {
4*67e74705SXin Li }
5*67e74705SXin Li 
foobool(int argc)6*67e74705SXin Li bool foobool(int argc) {
7*67e74705SXin Li   return argc;
8*67e74705SXin Li }
9*67e74705SXin Li 
10*67e74705SXin Li struct S1; // expected-note {{declared here}} expected-note{{forward declaration of 'S1'}}
11*67e74705SXin Li extern S1 a;
12*67e74705SXin Li class S2 {
13*67e74705SXin Li   mutable int a;
14*67e74705SXin Li 
15*67e74705SXin Li public:
S2()16*67e74705SXin Li   S2() : a(0) {}
S2(const S2 & s2)17*67e74705SXin Li   S2(const S2 &s2) : a(s2.a) {}
18*67e74705SXin Li   static float S2s;
19*67e74705SXin Li   static const float S2sc;
20*67e74705SXin Li };
21*67e74705SXin Li const float S2::S2sc = 0;
22*67e74705SXin Li const S2 b;
23*67e74705SXin Li const S2 ba[5];
24*67e74705SXin Li class S3 {
25*67e74705SXin Li   int a;
26*67e74705SXin Li   S3 &operator=(const S3 &s3);
27*67e74705SXin Li 
28*67e74705SXin Li public:
S3()29*67e74705SXin Li   S3() : a(0) {} // expected-note {{candidate constructor not viable: requires 0 arguments, but 1 was provided}}
S3(S3 & s3)30*67e74705SXin Li   S3(S3 &s3) : a(s3.a) {} // expected-note {{candidate constructor not viable: 1st argument ('const S3') would lose const qualifier}}
31*67e74705SXin Li };
32*67e74705SXin Li const S3 c;
33*67e74705SXin Li const S3 ca[5];
34*67e74705SXin Li extern const int f;
35*67e74705SXin Li class S4 {
36*67e74705SXin Li   int a;
37*67e74705SXin Li   S4();
38*67e74705SXin Li   S4(const S4 &s4);
39*67e74705SXin Li public:
S4(int v)40*67e74705SXin Li   S4(int v):a(v) { }
41*67e74705SXin Li };
42*67e74705SXin Li class S5 {
43*67e74705SXin Li   int a;
S5()44*67e74705SXin Li   S5():a(0) {}
S5(const S5 & s5)45*67e74705SXin Li   S5(const S5 &s5):a(s5.a) { }
46*67e74705SXin Li public:
S5(int v)47*67e74705SXin Li   S5(int v):a(v) { }
48*67e74705SXin Li };
49*67e74705SXin Li class S6 {
50*67e74705SXin Li   int a;
51*67e74705SXin Li public:
S6()52*67e74705SXin Li   S6() : a(0) { }
53*67e74705SXin Li };
54*67e74705SXin Li 
55*67e74705SXin Li S3 h;
56*67e74705SXin Li #pragma omp threadprivate(h) // expected-note {{defined as threadprivate or thread local}}
57*67e74705SXin Li 
main(int argc,char ** argv)58*67e74705SXin Li int main(int argc, char **argv) {
59*67e74705SXin Li   const int d = 5;
60*67e74705SXin Li   const int da[5] = { 0 };
61*67e74705SXin Li   S4 e(4);
62*67e74705SXin Li   S5 g(5);
63*67e74705SXin Li   S6 p;
64*67e74705SXin Li   int i;
65*67e74705SXin Li   int &j = i;
66*67e74705SXin Li   #pragma omp distribute firstprivate // expected-error {{expected '(' after 'firstprivate'}}
67*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
68*67e74705SXin Li   #pragma omp distribute firstprivate ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
69*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
70*67e74705SXin Li   #pragma omp distribute firstprivate () // expected-error {{expected expression}}
71*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
72*67e74705SXin Li   #pragma omp target
73*67e74705SXin Li   #pragma omp teams
74*67e74705SXin Li   #pragma omp distribute firstprivate (argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
75*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
76*67e74705SXin Li   #pragma omp target
77*67e74705SXin Li   #pragma omp teams
78*67e74705SXin Li   #pragma omp distribute firstprivate (argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
79*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
80*67e74705SXin Li   #pragma omp target
81*67e74705SXin Li   #pragma omp teams
82*67e74705SXin Li   #pragma omp distribute firstprivate (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
83*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
84*67e74705SXin Li   #pragma omp target
85*67e74705SXin Li   #pragma omp teams
86*67e74705SXin Li   #pragma omp distribute firstprivate (argc)
87*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
88*67e74705SXin Li   #pragma omp target
89*67e74705SXin Li   #pragma omp teams
90*67e74705SXin Li   #pragma omp distribute firstprivate (S1) // expected-error {{'S1' does not refer to a value}}
91*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
92*67e74705SXin Li   #pragma omp target
93*67e74705SXin Li   #pragma omp teams
94*67e74705SXin Li   #pragma omp distribute firstprivate (a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}}
95*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
96*67e74705SXin Li   #pragma omp target
97*67e74705SXin Li   #pragma omp teams
98*67e74705SXin Li   #pragma omp distribute firstprivate (argv[1]) // expected-error {{expected variable name}}
99*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
100*67e74705SXin Li   #pragma omp target
101*67e74705SXin Li   #pragma omp teams
102*67e74705SXin Li   #pragma omp distribute firstprivate(ba)
103*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
104*67e74705SXin Li   #pragma omp target
105*67e74705SXin Li   #pragma omp teams
106*67e74705SXin Li   #pragma omp distribute firstprivate(ca) // expected-error {{no matching constructor for initialization of 'S3'}}
107*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
108*67e74705SXin Li   #pragma omp target
109*67e74705SXin Li   #pragma omp teams
110*67e74705SXin Li   #pragma omp distribute firstprivate(da)
111*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
112*67e74705SXin Li   #pragma omp target
113*67e74705SXin Li   #pragma omp teams
114*67e74705SXin Li   #pragma omp distribute firstprivate(S2::S2s)
115*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
116*67e74705SXin Li   #pragma omp target
117*67e74705SXin Li   #pragma omp teams
118*67e74705SXin Li   #pragma omp distribute firstprivate(S2::S2sc)
119*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
120*67e74705SXin Li   #pragma omp target
121*67e74705SXin Li   #pragma omp teams
122*67e74705SXin Li   #pragma omp distribute firstprivate(h) // expected-error {{threadprivate or thread local variable cannot be firstprivate}}
123*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
124*67e74705SXin Li   #pragma omp target
125*67e74705SXin Li   #pragma omp teams
126*67e74705SXin Li   #pragma omp distribute private(i), firstprivate(i) // expected-error {{private variable cannot be firstprivate}} expected-note{{defined as private}}
127*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
128*67e74705SXin Li   #pragma omp target
129*67e74705SXin Li   #pragma omp teams shared(i)
130*67e74705SXin Li   #pragma omp distribute firstprivate(i)
131*67e74705SXin Li   for (j = 0; j < argc; ++j) foo();
132*67e74705SXin Li   #pragma omp target
133*67e74705SXin Li   #pragma omp teams shared(i)
134*67e74705SXin Li   #pragma omp distribute firstprivate(i) // expected-note {{defined as firstprivate}}
135*67e74705SXin Li   for (i = 0; i < argc; ++i) foo(); // expected-error {{loop iteration variable in the associated loop of 'omp distribute' directive may not be firstprivate, predetermined as private}}
136*67e74705SXin Li   #pragma omp target
137*67e74705SXin Li   #pragma omp teams private(argc) // expected-note {{defined as private}}
138*67e74705SXin Li   #pragma omp distribute firstprivate(argc) // expected-error {{private variable in '#pragma omp teams' cannot be firstprivate in '#pragma omp distribute'}}
139*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
140*67e74705SXin Li   #pragma omp target
141*67e74705SXin Li   #pragma omp teams reduction(+:argc) // expected-note {{defined as reduction}}
142*67e74705SXin Li   #pragma omp distribute firstprivate(argc) // expected-error {{reduction variable in '#pragma omp teams' cannot be firstprivate in '#pragma omp distribute'}}
143*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
144*67e74705SXin Li   #pragma omp target
145*67e74705SXin Li   #pragma omp teams
146*67e74705SXin Li   #pragma omp distribute firstprivate(j)
147*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
148*67e74705SXin Li   #pragma omp target
149*67e74705SXin Li   #pragma omp teams
150*67e74705SXin Li   #pragma omp distribute lastprivate(argc), firstprivate(argc) // expected-error {{lastprivate variable cannot be firstprivate in '#pragma omp distribute'}} expected-note{{defined as lastprivate}}
151*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
152*67e74705SXin Li   #pragma omp target
153*67e74705SXin Li   #pragma omp teams
154*67e74705SXin Li #pragma omp distribute firstprivate(argc), lastprivate(argc)  // expected-error {{lastprivate variable cannot be firstprivate in '#pragma omp distribute'}} expected-note{{defined as firstprivate}}
155*67e74705SXin Li   for (i = 0; i < argc; ++i) foo();
156*67e74705SXin Li   return 0;
157*67e74705SXin Li }
158