1*a914888bSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -o - %s -Wuninitialized
2d48bcd8aSAlexey Bataev 
3*a914888bSAlexey Bataev // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -o - %s -Wuninitialized
4a8a9153aSAlexey Bataev 
foo()5d48bcd8aSAlexey Bataev void foo() {
6d48bcd8aSAlexey Bataev }
7d48bcd8aSAlexey Bataev 
foobool(int argc)8d48bcd8aSAlexey Bataev bool foobool(int argc) {
9d48bcd8aSAlexey Bataev   return argc;
10d48bcd8aSAlexey Bataev }
11d48bcd8aSAlexey Bataev 
12d48bcd8aSAlexey Bataev struct S1; // expected-note {{declared here}}
13d48bcd8aSAlexey Bataev class S2 {
14d48bcd8aSAlexey Bataev   mutable int a;
15d48bcd8aSAlexey Bataev public:
S2()16d48bcd8aSAlexey Bataev   S2():a(0) { }
operator =(S2 & s2)17d48bcd8aSAlexey Bataev   S2 & operator =(S2 &s2) { return *this; }
18d48bcd8aSAlexey Bataev };
19d48bcd8aSAlexey Bataev class S3 {
20d48bcd8aSAlexey Bataev   int a;
21d48bcd8aSAlexey Bataev public:
S3()22d48bcd8aSAlexey Bataev   S3():a(0) { }
operator =(S3 & s3)23d48bcd8aSAlexey Bataev   S3 &operator =(S3 &s3) { return *this; }
24d48bcd8aSAlexey Bataev };
25f56f98c9SAlexey Bataev class S4 {
26d48bcd8aSAlexey Bataev   int a;
27d48bcd8aSAlexey Bataev   S4();
28f56f98c9SAlexey Bataev   S4 &operator =(const S4 &s4); // expected-note {{implicitly declared private here}}
29d48bcd8aSAlexey Bataev public:
S4(int v)30d48bcd8aSAlexey Bataev   S4(int v):a(v) { }
31d48bcd8aSAlexey Bataev };
32f56f98c9SAlexey Bataev class S5 {
33d48bcd8aSAlexey Bataev   int a;
S5()34d48bcd8aSAlexey Bataev   S5():a(0) {}
operator =(const S5 & s5)35f56f98c9SAlexey Bataev   S5 &operator =(const S5 &s5) { return *this; } // expected-note {{implicitly declared private here}}
36d48bcd8aSAlexey Bataev public:
S5(int v)37d48bcd8aSAlexey Bataev   S5(int v):a(v) { }
38d48bcd8aSAlexey Bataev };
39d48bcd8aSAlexey Bataev template <class T>
40d48bcd8aSAlexey Bataev class ST {
41d48bcd8aSAlexey Bataev public:
42d48bcd8aSAlexey Bataev   static T s;
43d48bcd8aSAlexey Bataev };
44d48bcd8aSAlexey Bataev 
456ddfe1a6SAlexey Bataev namespace A {
466ddfe1a6SAlexey Bataev double x;
476ddfe1a6SAlexey Bataev #pragma omp threadprivate(x)
486ddfe1a6SAlexey Bataev }
496ddfe1a6SAlexey Bataev namespace B {
506ddfe1a6SAlexey Bataev using A::x;
516ddfe1a6SAlexey Bataev }
52d48bcd8aSAlexey Bataev 
53d48bcd8aSAlexey Bataev S2 k;
54d48bcd8aSAlexey Bataev S3 h;
55f56f98c9SAlexey Bataev S4 l(3);
56f56f98c9SAlexey Bataev S5 m(4);
57d48bcd8aSAlexey Bataev #pragma omp threadprivate(h, k, l, m)
58d48bcd8aSAlexey Bataev 
main(int argc,char ** argv)59d48bcd8aSAlexey Bataev int main(int argc, char **argv) {
60d48bcd8aSAlexey Bataev   int i;
61d48bcd8aSAlexey Bataev   #pragma omp parallel copyin // expected-error {{expected '(' after 'copyin'}}
62d48bcd8aSAlexey Bataev   #pragma omp parallel copyin ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
63d48bcd8aSAlexey Bataev   #pragma omp parallel copyin () // expected-error {{expected expression}}
64d48bcd8aSAlexey Bataev   #pragma omp parallel copyin (k // expected-error {{expected ')'}} expected-note {{to match this '('}}
65c5970623SAlexey Bataev   #pragma omp parallel copyin (h, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
66d48bcd8aSAlexey Bataev   #pragma omp parallel copyin (argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
67f56f98c9SAlexey Bataev   #pragma omp parallel copyin (l) // expected-error {{'operator=' is a private member of 'S4'}}
68d48bcd8aSAlexey Bataev   #pragma omp parallel copyin (S1) // expected-error {{'S1' does not refer to a value}}
69d48bcd8aSAlexey Bataev   #pragma omp parallel copyin (argv[1]) // expected-error {{expected variable name}}
70d48bcd8aSAlexey Bataev   #pragma omp parallel copyin(i) // expected-error {{copyin variable must be threadprivate}}
71f56f98c9SAlexey Bataev   #pragma omp parallel copyin(m) // expected-error {{'operator=' is a private member of 'S5'}}
72d48bcd8aSAlexey Bataev   #pragma omp parallel copyin(ST<int>::s) // expected-error {{copyin variable must be threadprivate}}
736ddfe1a6SAlexey Bataev   #pragma omp parallel copyin(B::x)
74d48bcd8aSAlexey Bataev   foo();
75d48bcd8aSAlexey Bataev 
76d48bcd8aSAlexey Bataev   return 0;
77d48bcd8aSAlexey Bataev }
78