1 // RUN: %clang_cc1 -verify -fopenmp=libiomp5 %s 2 3 void foo() { 4 } 5 6 struct S1; // expected-note 2 {{declared here}} 7 class S2 { 8 mutable int a; 9 10 public: 11 S2() : a(0) {} 12 S2 &operator=(S2 &s2) { return *this; } 13 }; 14 class S3 { 15 int a; 16 17 public: 18 S3() : a(0) {} 19 S3 &operator=(S3 &s3) { return *this; } 20 }; 21 class S4 { 22 int a; 23 S4(); 24 S4 &operator=(const S4 &s4); // expected-note 3 {{implicitly declared private here}} 25 26 public: 27 S4(int v) : a(v) {} 28 }; 29 class S5 { 30 int a; 31 S5() : a(0) {} 32 S5 &operator=(const S5 &s5) { return *this; } // expected-note 3 {{implicitly declared private here}} 33 34 public: 35 S5(int v) : a(v) {} 36 }; 37 38 S2 k; 39 S3 h; 40 S4 l(3); 41 S5 m(4); 42 #pragma omp threadprivate(h, k, l, m) 43 44 template <class T, class C> 45 T tmain(T argc, C **argv) { 46 T i; 47 static T TA; 48 #pragma omp parallel 49 #pragma omp single copyprivate // expected-error {{expected '(' after 'copyprivate'}} 50 #pragma omp parallel 51 #pragma omp single copyprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 52 #pragma omp parallel 53 #pragma omp single copyprivate() // expected-error {{expected expression}} 54 #pragma omp parallel 55 #pragma omp single copyprivate(k // expected-error {{expected ')'}} expected-note {{to match this '('}} 56 #pragma omp parallel 57 #pragma omp single copyprivate(h, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 58 #pragma omp parallel 59 #pragma omp single copyprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 60 #pragma omp parallel 61 #pragma omp single copyprivate(l) // expected-error 2 {{'operator=' is a private member of 'S4'}} 62 #pragma omp parallel 63 #pragma omp single copyprivate(S1) // expected-error {{'S1' does not refer to a value}} 64 #pragma omp parallel 65 #pragma omp single copyprivate(argv[1]) // expected-error {{expected variable name}} 66 #pragma omp parallel // expected-note {{implicitly determined as shared}} 67 #pragma omp single copyprivate(i) // expected-error {{copyprivate variable must be threadprivate or private in the enclosing context}} 68 #pragma omp parallel 69 #pragma omp single copyprivate(m) // expected-error 2 {{'operator=' is a private member of 'S5'}} 70 foo(); 71 #pragma omp parallel private(i) 72 { 73 #pragma omp single copyprivate(i) 74 foo(); 75 } 76 #pragma omp parallel shared(i) // expected-note {{defined as shared}} 77 { 78 #pragma omp single copyprivate(i) // expected-error {{copyprivate variable must be threadprivate or private in the enclosing context}} 79 foo(); 80 } 81 #pragma omp parallel private(i) 82 #pragma omp parallel default(shared) // expected-note {{implicitly determined as shared}} 83 { 84 #pragma omp single copyprivate(i) // expected-error {{copyprivate variable must be threadprivate or private in the enclosing context}} 85 foo(); 86 } 87 #pragma omp parallel private(i) 88 #pragma omp parallel // expected-note {{implicitly determined as shared}} 89 { 90 #pragma omp single copyprivate(i) // expected-error {{copyprivate variable must be threadprivate or private in the enclosing context}} 91 foo(); 92 } 93 #pragma omp parallel 94 #pragma omp single private(i) copyprivate(i) // expected-error {{private variable cannot be copyprivate}} expected-note {{defined as private}} 95 foo(); 96 #pragma omp parallel 97 #pragma omp single firstprivate(i) copyprivate(i) // expected-error {{firstprivate variable cannot be copyprivate}} expected-note {{defined as firstprivate}} 98 foo(); 99 #pragma omp parallel private(TA) 100 { 101 #pragma omp single copyprivate(TA) 102 TA = 99; 103 } 104 105 return T(); 106 } 107 108 namespace A { 109 double x; 110 #pragma omp threadprivate(x) 111 } 112 namespace B { 113 using A::x; 114 } 115 116 int main(int argc, char **argv) { 117 int i; 118 static int intA; 119 #pragma omp parallel 120 #pragma omp single copyprivate // expected-error {{expected '(' after 'copyprivate'}} 121 #pragma omp parallel 122 #pragma omp single copyprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 123 #pragma omp parallel 124 #pragma omp single copyprivate() // expected-error {{expected expression}} 125 #pragma omp parallel 126 #pragma omp single copyprivate(k // expected-error {{expected ')'}} expected-note {{to match this '('}} 127 #pragma omp parallel 128 #pragma omp single copyprivate(h, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 129 #pragma omp parallel 130 #pragma omp single copyprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 131 #pragma omp parallel 132 #pragma omp single copyprivate(l, B::x) // expected-error {{'operator=' is a private member of 'S4'}} 133 #pragma omp parallel 134 #pragma omp single copyprivate(S1) // expected-error {{'S1' does not refer to a value}} 135 #pragma omp parallel 136 #pragma omp single copyprivate(argv[1]) // expected-error {{expected variable name}} 137 #pragma omp parallel // expected-note {{implicitly determined as shared}} 138 #pragma omp single copyprivate(i) // expected-error {{copyprivate variable must be threadprivate or private in the enclosing context}} 139 #pragma omp parallel 140 #pragma omp single copyprivate(m) // expected-error {{'operator=' is a private member of 'S5'}} 141 foo(); 142 #pragma omp parallel private(i) 143 { 144 #pragma omp single copyprivate(i) 145 foo(); 146 } 147 #pragma omp parallel shared(i) // expected-note {{defined as shared}} 148 { 149 #pragma omp single copyprivate(i) // expected-error {{copyprivate variable must be threadprivate or private in the enclosing context}} 150 foo(); 151 } 152 #pragma omp parallel private(i) 153 #pragma omp parallel default(shared) // expected-note {{implicitly determined as shared}} 154 { 155 #pragma omp single copyprivate(i) // expected-error {{copyprivate variable must be threadprivate or private in the enclosing context}} 156 foo(); 157 } 158 #pragma omp parallel private(i) 159 #pragma omp parallel // expected-note {{implicitly determined as shared}} 160 { 161 #pragma omp single copyprivate(i) // expected-error {{copyprivate variable must be threadprivate or private in the enclosing context}} 162 foo(); 163 } 164 #pragma omp parallel 165 #pragma omp single private(i) copyprivate(i) // expected-error {{private variable cannot be copyprivate}} expected-note {{defined as private}} 166 foo(); 167 #pragma omp parallel 168 #pragma omp single firstprivate(i) copyprivate(i) // expected-error {{firstprivate variable cannot be copyprivate}} expected-note {{defined as firstprivate}} 169 foo(); 170 #pragma omp single copyprivate(i) nowait // expected-error {{the 'copyprivate' clause must not be used with the 'nowait' clause}} expected-note {{'nowait' clause is here}} 171 foo(); 172 #pragma omp parallel private(intA) 173 { 174 #pragma omp single copyprivate(intA) 175 intA = 99; 176 } 177 178 return tmain(argc, argv); // expected-note {{in instantiation of function template specialization 'tmain<int, char>' requested here}} 179 } 180 181 extern void abort(void); 182 183 void 184 single(int a, int b) { 185 #pragma omp single copyprivate(a) copyprivate(b) 186 { 187 a = b = 5; 188 } 189 190 if (a != b) 191 abort(); 192 } 193 194 int parallel() { 195 #pragma omp parallel 196 single(1, 2); 197 198 return 0; 199 } 200