1*a914888bSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -o - %s -Wuninitialized
2e4e893bbSAlexander Musman 
3*a914888bSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd -o - %s -Wuninitialized
4a8a9153aSAlexey Bataev 
foo()5e4e893bbSAlexander Musman void foo() {
6e4e893bbSAlexander Musman }
7e4e893bbSAlexander Musman 
foobool(int argc)8e4e893bbSAlexander Musman bool foobool(int argc) {
9e4e893bbSAlexander Musman   return argc;
10e4e893bbSAlexander Musman }
11e4e893bbSAlexander Musman 
12e4e893bbSAlexander Musman struct S1; // expected-note {{declared here}}
13e4e893bbSAlexander Musman class S2 {
14e4e893bbSAlexander Musman   mutable int a;
15e4e893bbSAlexander Musman 
16e4e893bbSAlexander Musman public:
S2()17e4e893bbSAlexander Musman   S2() : a(0) {}
operator =(S2 & s2)18e4e893bbSAlexander Musman   S2 &operator=(S2 &s2) { return *this; }
19e4e893bbSAlexander Musman };
20e4e893bbSAlexander Musman class S3 {
21e4e893bbSAlexander Musman   int a;
22e4e893bbSAlexander Musman 
23e4e893bbSAlexander Musman public:
S3()24e4e893bbSAlexander Musman   S3() : a(0) {}
operator =(S3 & s3)25e4e893bbSAlexander Musman   S3 &operator=(S3 &s3) { return *this; }
26e4e893bbSAlexander Musman };
27f56f98c9SAlexey Bataev class S4 {
28e4e893bbSAlexander Musman   int a;
29e4e893bbSAlexander Musman   S4();
30f56f98c9SAlexey Bataev   S4 &operator=(const S4 &s4); // expected-note {{implicitly declared private here}}
31e4e893bbSAlexander Musman 
32e4e893bbSAlexander Musman public:
S4(int v)33e4e893bbSAlexander Musman   S4(int v) : a(v) {}
34e4e893bbSAlexander Musman };
35f56f98c9SAlexey Bataev class S5 {
36e4e893bbSAlexander Musman   int a;
S5()37e4e893bbSAlexander Musman   S5() : a(0) {}
operator =(const S5 & s5)38f56f98c9SAlexey Bataev   S5 &operator=(const S5 &s5) { return *this; } // expected-note {{implicitly declared private here}}
39e4e893bbSAlexander Musman 
40e4e893bbSAlexander Musman public:
S5(int v)41e4e893bbSAlexander Musman   S5(int v) : a(v) {}
42e4e893bbSAlexander Musman };
43e4e893bbSAlexander Musman template <class T>
44e4e893bbSAlexander Musman class ST {
45e4e893bbSAlexander Musman public:
46e4e893bbSAlexander Musman   static T s;
47e4e893bbSAlexander Musman };
48e4e893bbSAlexander Musman 
49e4e893bbSAlexander Musman S2 k;
50e4e893bbSAlexander Musman S3 h;
51f56f98c9SAlexey Bataev S4 l(3);
52f56f98c9SAlexey Bataev S5 m(4);
53e4e893bbSAlexander Musman #pragma omp threadprivate(h, k, l, m)
54e4e893bbSAlexander Musman 
556ddfe1a6SAlexey Bataev namespace A {
566ddfe1a6SAlexey Bataev double x;
576ddfe1a6SAlexey Bataev #pragma omp threadprivate(x)
586ddfe1a6SAlexey Bataev }
596ddfe1a6SAlexey Bataev namespace B {
606ddfe1a6SAlexey Bataev using A::x;
616ddfe1a6SAlexey Bataev }
626ddfe1a6SAlexey Bataev 
main(int argc,char ** argv)63e4e893bbSAlexander Musman int main(int argc, char **argv) {
64e4e893bbSAlexander Musman   int i;
65e4e893bbSAlexander Musman #pragma omp parallel for simd copyin // expected-error {{expected '(' after 'copyin'}}
66e4e893bbSAlexander Musman   for (i = 0; i < argc; ++i)
67e4e893bbSAlexander Musman     foo();
68e4e893bbSAlexander Musman #pragma omp parallel for simd copyin( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
69e4e893bbSAlexander Musman   for (i = 0; i < argc; ++i)
70e4e893bbSAlexander Musman     foo();
71e4e893bbSAlexander Musman #pragma omp parallel for simd copyin() // expected-error {{expected expression}}
72e4e893bbSAlexander Musman   for (i = 0; i < argc; ++i)
73e4e893bbSAlexander Musman     foo();
74e4e893bbSAlexander Musman #pragma omp parallel for simd copyin(k // expected-error {{expected ')'}} expected-note {{to match this '('}}
75e4e893bbSAlexander Musman   for (i = 0; i < argc; ++i)
76e4e893bbSAlexander Musman     foo();
77c5970623SAlexey Bataev #pragma omp parallel for simd copyin(h, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
78e4e893bbSAlexander Musman   for (i = 0; i < argc; ++i)
79e4e893bbSAlexander Musman     foo();
80e4e893bbSAlexander Musman #pragma omp parallel for simd copyin(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
81e4e893bbSAlexander Musman   for (i = 0; i < argc; ++i)
82e4e893bbSAlexander Musman     foo();
83f56f98c9SAlexey Bataev #pragma omp parallel for simd copyin(l) // expected-error {{'operator=' is a private member of 'S4'}}
84e4e893bbSAlexander Musman   for (i = 0; i < argc; ++i)
85e4e893bbSAlexander Musman     foo();
86e4e893bbSAlexander Musman #pragma omp parallel for simd copyin(S1) // expected-error {{'S1' does not refer to a value}}
87e4e893bbSAlexander Musman   for (i = 0; i < argc; ++i)
88e4e893bbSAlexander Musman     foo();
89e4e893bbSAlexander Musman #pragma omp parallel for simd copyin(argv[1]) // expected-error {{expected variable name}}
90e4e893bbSAlexander Musman   for (i = 0; i < argc; ++i)
91e4e893bbSAlexander Musman     foo();
92e4e893bbSAlexander Musman #pragma omp parallel for simd copyin(i) // expected-error {{copyin variable must be threadprivate}}
93e4e893bbSAlexander Musman   for (i = 0; i < argc; ++i)
94e4e893bbSAlexander Musman     foo();
95f56f98c9SAlexey Bataev #pragma omp parallel for simd copyin(m) // expected-error {{'operator=' is a private member of 'S5'}}
96e4e893bbSAlexander Musman   for (i = 0; i < argc; ++i)
97e4e893bbSAlexander Musman     foo();
986ddfe1a6SAlexey Bataev #pragma omp parallel for simd copyin(ST < int > ::s, B::x) // expected-error {{copyin variable must be threadprivate}}
99e4e893bbSAlexander Musman   for (i = 0; i < argc; ++i)
100e4e893bbSAlexander Musman     foo();
101e4e893bbSAlexander Musman 
102e4e893bbSAlexander Musman   return 0;
103e4e893bbSAlexander Musman }
104