xref: /llvm-project/clang/test/OpenMP/parallel_master_taskloop_private_messages.cpp (revision 8026394d3cc77db6f8172eeaa83b9747979c8642)
15bbceadfSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp %s -Wuninitialized
25bbceadfSAlexey Bataev 
35bbceadfSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized
45bbceadfSAlexey Bataev 
55bbceadfSAlexey Bataev typedef void **omp_allocator_handle_t;
6*8026394dSAlexey Bataev extern const omp_allocator_handle_t omp_null_allocator;
75bbceadfSAlexey Bataev extern const omp_allocator_handle_t omp_default_mem_alloc;
85bbceadfSAlexey Bataev extern const omp_allocator_handle_t omp_large_cap_mem_alloc;
95bbceadfSAlexey Bataev extern const omp_allocator_handle_t omp_const_mem_alloc;
105bbceadfSAlexey Bataev extern const omp_allocator_handle_t omp_high_bw_mem_alloc;
115bbceadfSAlexey Bataev extern const omp_allocator_handle_t omp_low_lat_mem_alloc;
125bbceadfSAlexey Bataev extern const omp_allocator_handle_t omp_cgroup_mem_alloc;
135bbceadfSAlexey Bataev extern const omp_allocator_handle_t omp_pteam_mem_alloc;
145bbceadfSAlexey Bataev extern const omp_allocator_handle_t omp_thread_mem_alloc;
155bbceadfSAlexey Bataev 
foo()165bbceadfSAlexey Bataev void foo() {
175bbceadfSAlexey Bataev }
185bbceadfSAlexey Bataev 
foobool(int argc)195bbceadfSAlexey Bataev bool foobool(int argc) {
205bbceadfSAlexey Bataev   return argc;
215bbceadfSAlexey Bataev }
225bbceadfSAlexey Bataev 
235bbceadfSAlexey Bataev struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}
245bbceadfSAlexey Bataev extern S1 a;
255bbceadfSAlexey Bataev class S2 {
265bbceadfSAlexey Bataev   mutable int a;
275bbceadfSAlexey Bataev 
285bbceadfSAlexey Bataev public:
S2()295bbceadfSAlexey Bataev   S2() : a(0) {}
305bbceadfSAlexey Bataev };
315bbceadfSAlexey Bataev const S2 b;
325bbceadfSAlexey Bataev const S2 ba[5];
335bbceadfSAlexey Bataev class S3 {
345bbceadfSAlexey Bataev   int a;
355bbceadfSAlexey Bataev 
365bbceadfSAlexey Bataev public:
S3()375bbceadfSAlexey Bataev   S3() : a(0) {}
385bbceadfSAlexey Bataev };
395bbceadfSAlexey Bataev const S3 ca[5];
405bbceadfSAlexey Bataev class S4 {
415bbceadfSAlexey Bataev   int a;
425bbceadfSAlexey Bataev   S4(); // expected-note {{implicitly declared private here}}
435bbceadfSAlexey Bataev 
445bbceadfSAlexey Bataev public:
S4(int v)455bbceadfSAlexey Bataev   S4(int v) : a(v) {
465bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a) private(this->a)
475bbceadfSAlexey Bataev     for (int k = 0; k < v; ++k)
485bbceadfSAlexey Bataev       ++this->a;
495bbceadfSAlexey Bataev   }
505bbceadfSAlexey Bataev };
515bbceadfSAlexey Bataev class S5 {
525bbceadfSAlexey Bataev   int a;
S5()535bbceadfSAlexey Bataev   S5() : a(0) {} // expected-note {{implicitly declared private here}}
545bbceadfSAlexey Bataev 
555bbceadfSAlexey Bataev public:
S5(int v)565bbceadfSAlexey Bataev   S5(int v) : a(v) {}
operator =(S5 & s)575bbceadfSAlexey Bataev   S5 &operator=(S5 &s) {
585bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a) private(this->a) private(s.a) // expected-error {{expected variable name or data member of current class}}
595bbceadfSAlexey Bataev     for (int k = 0; k < s.a; ++k)
605bbceadfSAlexey Bataev       ++s.a;
615bbceadfSAlexey Bataev     return *this;
625bbceadfSAlexey Bataev   }
635bbceadfSAlexey Bataev };
645bbceadfSAlexey Bataev 
655bbceadfSAlexey Bataev template <typename T>
665bbceadfSAlexey Bataev class S6 {
675bbceadfSAlexey Bataev public:
685bbceadfSAlexey Bataev   T a;
695bbceadfSAlexey Bataev 
S6()705bbceadfSAlexey Bataev   S6() : a(0) {}
S6(T v)715bbceadfSAlexey Bataev   S6(T v) : a(v) {
725bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a) private(this->a) allocate(omp_thread_mem_alloc: a) // expected-warning {{allocator with the 'thread' trait access has unspecified behavior on 'parallel master taskloop' directive}}
735bbceadfSAlexey Bataev     for (int k = 0; k < v; ++k)
745bbceadfSAlexey Bataev       ++this->a;
755bbceadfSAlexey Bataev   }
operator =(S6 & s)765bbceadfSAlexey Bataev   S6 &operator=(S6 &s) {
775bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a) private(this->a) private(s.a) // expected-error {{expected variable name or data member of current class}}
785bbceadfSAlexey Bataev     for (int k = 0; k < s.a; ++k)
795bbceadfSAlexey Bataev       ++s.a;
805bbceadfSAlexey Bataev     return *this;
815bbceadfSAlexey Bataev   }
825bbceadfSAlexey Bataev };
835bbceadfSAlexey Bataev 
845bbceadfSAlexey Bataev template <typename T>
855bbceadfSAlexey Bataev class S7 : public T {
865bbceadfSAlexey Bataev   T a;
S7()875bbceadfSAlexey Bataev   S7() : a(0) {}
885bbceadfSAlexey Bataev 
895bbceadfSAlexey Bataev public:
S7(T v)905bbceadfSAlexey Bataev   S7(T v) : a(v) {
915bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a) private(this->a) private(T::a)
925bbceadfSAlexey Bataev     for (int k = 0; k < a.a; ++k)
935bbceadfSAlexey Bataev       ++this->a.a;
945bbceadfSAlexey Bataev   }
operator =(S7 & s)955bbceadfSAlexey Bataev   S7 &operator=(S7 &s) {
965bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a) private(this->a) private(s.a) private(s.T::a) // expected-error 2 {{expected variable name or data member of current class}}
975bbceadfSAlexey Bataev     for (int k = 0; k < s.a.a; ++k)
985bbceadfSAlexey Bataev       ++s.a.a;
995bbceadfSAlexey Bataev     return *this;
1005bbceadfSAlexey Bataev   }
1015bbceadfSAlexey Bataev };
1025bbceadfSAlexey Bataev 
1035bbceadfSAlexey Bataev S3 h;
1045bbceadfSAlexey Bataev #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
1055bbceadfSAlexey Bataev 
1065bbceadfSAlexey Bataev template <class I, class C>
foomain(I argc,C ** argv)1075bbceadfSAlexey Bataev int foomain(I argc, C **argv) {
1085bbceadfSAlexey Bataev   I e(4);
1095bbceadfSAlexey Bataev   I g(5);
1105bbceadfSAlexey Bataev   int i, z;
1115bbceadfSAlexey Bataev   int &j = i;
1125bbceadfSAlexey Bataev #pragma omp parallel master taskloop private // expected-error {{expected '(' after 'private'}}
1135bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
1145bbceadfSAlexey Bataev     ++k;
1155bbceadfSAlexey Bataev #pragma omp parallel master taskloop private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
1165bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
1175bbceadfSAlexey Bataev     ++k;
1185bbceadfSAlexey Bataev #pragma omp parallel master taskloop private() // expected-error {{expected expression}}
1195bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
1205bbceadfSAlexey Bataev     ++k;
1215bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
1225bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
1235bbceadfSAlexey Bataev     ++k;
1245bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
1255bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
1265bbceadfSAlexey Bataev     ++k;
1275bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
1285bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
1295bbceadfSAlexey Bataev     ++k;
1305bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(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 '('}}
1315bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
1325bbceadfSAlexey Bataev     ++k;
1335bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(S1) // expected-error {{'S1' does not refer to a value}}
1345bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
1355bbceadfSAlexey Bataev     ++k;
1365bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
1375bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
1385bbceadfSAlexey Bataev     ++k;
1395bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argv[1]) // expected-error {{expected variable name}}
1405bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
1415bbceadfSAlexey Bataev     ++k;
1425bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(e, g, z)
1435bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
1445bbceadfSAlexey Bataev     ++k;
1455bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
1465bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
1475bbceadfSAlexey Bataev     ++k;
1485bbceadfSAlexey Bataev #pragma omp parallel master taskloop shared(i)
1495bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
1505bbceadfSAlexey Bataev     ++k;
1515bbceadfSAlexey Bataev #pragma omp parallel
1525bbceadfSAlexey Bataev   {
1535bbceadfSAlexey Bataev     int v = 0;
1545bbceadfSAlexey Bataev     int i;
1555bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(i)
1565bbceadfSAlexey Bataev     for (int k = 0; k < argc; ++k) {
1575bbceadfSAlexey Bataev       i = k;
1585bbceadfSAlexey Bataev       v += i;
1595bbceadfSAlexey Bataev     }
1605bbceadfSAlexey Bataev   }
1615bbceadfSAlexey Bataev #pragma omp parallel shared(i)
1625bbceadfSAlexey Bataev #pragma omp parallel private(i)
1635bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(j)
1645bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
1655bbceadfSAlexey Bataev     ++k;
1665bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(i)
1675bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
1685bbceadfSAlexey Bataev     ++k;
1695bbceadfSAlexey Bataev   return 0;
1705bbceadfSAlexey Bataev }
1715bbceadfSAlexey Bataev 
bar(S4 a[2])1725bbceadfSAlexey Bataev void bar(S4 a[2]) {
1735bbceadfSAlexey Bataev #pragma omp parallel
1745bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a)
1755bbceadfSAlexey Bataev   for (int i = 0; i < 2; ++i)
1765bbceadfSAlexey Bataev     foo();
1775bbceadfSAlexey Bataev }
1785bbceadfSAlexey Bataev 
1795bbceadfSAlexey Bataev namespace A {
1805bbceadfSAlexey Bataev double x;
1815bbceadfSAlexey Bataev #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
1825bbceadfSAlexey Bataev }
1835bbceadfSAlexey Bataev namespace B {
1845bbceadfSAlexey Bataev using A::x;
1855bbceadfSAlexey Bataev }
1865bbceadfSAlexey Bataev 
main(int argc,char ** argv)1875bbceadfSAlexey Bataev int main(int argc, char **argv) {
1885bbceadfSAlexey Bataev   S4 e(4);
1895bbceadfSAlexey Bataev   S5 g(5);
1905bbceadfSAlexey Bataev   S6<float> s6(0.0) , s6_0(1.0); // expected-note {{in instantiation of member function 'S6<float>::S6' requested here}}
1915bbceadfSAlexey Bataev   S7<S6<float> > s7(0.0) , s7_0(1.0);
1925bbceadfSAlexey Bataev   int i, z;
1935bbceadfSAlexey Bataev   int &j = i;
1945bbceadfSAlexey Bataev #pragma omp parallel master taskloop private // expected-error {{expected '(' after 'private'}}
1955bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
1965bbceadfSAlexey Bataev     ++k;
1975bbceadfSAlexey Bataev #pragma omp parallel master taskloop private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
1985bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
1995bbceadfSAlexey Bataev     ++k;
2005bbceadfSAlexey Bataev #pragma omp parallel master taskloop private() // expected-error {{expected expression}}
2015bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
2025bbceadfSAlexey Bataev     ++k;
2035bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
2045bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
2055bbceadfSAlexey Bataev     ++k;
2065bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
2075bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
2085bbceadfSAlexey Bataev     ++k;
2095bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
2105bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
2115bbceadfSAlexey Bataev     ++k;
2125bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argc)
2135bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
2145bbceadfSAlexey Bataev     ++k;
2155bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(S1) // expected-error {{'S1' does not refer to a value}}
2165bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
2175bbceadfSAlexey Bataev     ++k;
2185bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
2195bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
2205bbceadfSAlexey Bataev     ++k;
2215bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(argv[1]) // expected-error {{expected variable name}}
2225bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
2235bbceadfSAlexey Bataev     ++k;
2245bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
2255bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
2265bbceadfSAlexey Bataev     ++k;
2275bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
2285bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
2295bbceadfSAlexey Bataev     ++k;
2305bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}}
2315bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
2325bbceadfSAlexey Bataev     ++k;
2335bbceadfSAlexey Bataev #pragma omp parallel master taskloop shared(i)
2345bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
2355bbceadfSAlexey Bataev     ++k;
2365bbceadfSAlexey Bataev #pragma omp parallel
2375bbceadfSAlexey Bataev   {
2385bbceadfSAlexey Bataev     int i;
2395bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(i)
2405bbceadfSAlexey Bataev     for (int k = 0; k < argc; ++k)
2415bbceadfSAlexey Bataev       ++k;
2425bbceadfSAlexey Bataev   }
2435bbceadfSAlexey Bataev #pragma omp parallel shared(i)
2445bbceadfSAlexey Bataev #pragma omp parallel private(i)
2455bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(j)
2465bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
2475bbceadfSAlexey Bataev     ++k;
2485bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(i, z)
2495bbceadfSAlexey Bataev   for (int k = 0; k < argc; ++k)
2505bbceadfSAlexey Bataev     ++k;
2515bbceadfSAlexey Bataev   static int si;
2525bbceadfSAlexey Bataev #pragma omp parallel master taskloop private(si) // OK
2535bbceadfSAlexey Bataev   for(int k = 0; k < argc; ++k)
2545bbceadfSAlexey Bataev     si = k + 1;
2555bbceadfSAlexey Bataev 
2565bbceadfSAlexey Bataev   s6 = s6_0; // expected-note {{in instantiation of member function 'S6<float>::operator=' requested here}}
2575bbceadfSAlexey Bataev   s7 = s7_0; // expected-note {{in instantiation of member function 'S7<S6<float>>::operator=' requested here}}
2585bbceadfSAlexey Bataev   return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char>' requested here}}
2595bbceadfSAlexey Bataev }
2605bbceadfSAlexey Bataev 
261