1 // RUN: %clang_cc1 -verify -fopenmp %s 2 3 // RUN: %clang_cc1 -verify -fopenmp-simd %s 4 5 void foo() { 6 } 7 8 struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}} expected-note 1 {{forward declaration of 'S1'}} expected-note {{forward declaration of 'S1'}} 9 extern S1 a; 10 class S2 { 11 mutable int a; 12 13 public: 14 S2() : a(0) {} 15 static float S2s; // expected-note {{static data member is predetermined as shared}} expected-note 1 {{static data member is predetermined as shared}} 16 }; 17 const S2 b; 18 const S2 ba[5]; 19 class S3 { 20 int a; 21 22 public: 23 S3() : a(0) {} 24 }; 25 const S3 c; // expected-note {{global variable is predetermined as shared}} expected-note 1 {{global variable is predetermined as shared}} 26 const S3 ca[5]; // expected-note {{global variable is predetermined as shared}} expected-note 1 {{global variable is predetermined as shared}} 27 extern const int f; // expected-note {{global variable is predetermined as shared}} expected-note 1 {{global variable is predetermined as shared}} 28 29 int threadvar; 30 #pragma omp threadprivate(threadvar) // expected-note {{defined as threadprivate or thread local}} expected-note 1 {{defined as threadprivate or thread local}} 31 32 class S4 { 33 int a; 34 S4(); // expected-note {{implicitly declared private here}} expected-note 1 {{implicitly declared private here}} 35 36 public: 37 S4(int v) : a(v) {} 38 }; 39 class S5 { 40 int a; 41 S5() : a(0) {} // expected-note {{implicitly declared private here}} expected-note 1 {{implicitly declared private here}} 42 43 public: 44 S5(int v) : a(v) {} 45 }; 46 namespace A { 47 double x; 48 #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}} expected-note 1 {{defined as threadprivate or thread local}} expected-note 2 {{defined as threadprivate or thread local}} 49 } 50 namespace B { 51 using A::x; 52 } 53 54 S3 h; 55 #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}} 56 57 template <class I, class C, class D, class E> 58 int foomain(I argc, C **argv) { 59 const I d = 5; // expected-note {{constant variable is predetermined as shared}} 60 const I da[5] = { 0 }; // expected-note {{constant variable is predetermined as shared}} 61 D e(4); 62 E g[] = {5, 6}; 63 I i; 64 I &j = i; 65 #pragma omp target parallel private // expected-error {{expected '(' after 'private'}} 66 {} 67 #pragma omp target parallel private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 68 {} 69 #pragma omp target parallel private() // expected-error {{expected expression}} 70 {} 71 #pragma omp target parallel private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} 72 {} 73 #pragma omp target parallel private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 74 {} 75 #pragma omp target parallel private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 76 {} 77 #pragma omp target parallel private(argc argv) // expected-error {{expected ',' or ')' in 'private' clause}} 78 {} 79 #pragma omp target parallel private(argc) 80 {} 81 #pragma omp target parallel private(S1) // expected-error {{'S1' does not refer to a value}} 82 {} 83 #pragma omp target parallel private(a, b) // expected-error {{private variable with incomplete type 'S1'}} 84 {} 85 #pragma omp target parallel private (a, b, c, d, f) // expected-error {{a private variable with incomplete type 'S1'}} expected-error 3 {{shared variable cannot be private}} 86 {} 87 #pragma omp target parallel private(argv[1]) // expected-error {{expected variable name}} 88 {} 89 #pragma omp target parallel private(ba) 90 {} 91 #pragma omp target parallel private(ca) // expected-error {{shared variable cannot be private}} 92 {} 93 #pragma omp target parallel private(da) // expected-error {{shared variable cannot be private}} 94 {} 95 #pragma omp target parallel private(S2::S2s) // expected-error {{shared variable cannot be private}} 96 {} 97 #pragma omp target parallel private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} 98 {} 99 #pragma omp target parallel private(threadvar, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}} 100 {} 101 #pragma omp target parallel shared(i), private(i) // expected-error {{shared variable cannot be private}} expected-note {{defined as shared}} 102 foo(); 103 #pragma omp target parallel firstprivate(i) private(i) // expected-error {{firstprivate variable cannot be private}} expected-note {{defined as firstprivate}} 104 foo(); 105 #pragma omp target parallel private(i) 106 {} 107 #pragma omp target parallel private(j) 108 foo(); 109 #pragma omp parallel firstprivate(i) 110 for (int k = 0; k < 10; ++k) { 111 #pragma omp target parallel private(i) 112 foo(); 113 } 114 static int m; 115 #pragma omp target parallel private(m) // OK 116 foo(); 117 #pragma omp target parallel private(h) // expected-error {{threadprivate or thread local variable cannot be private}} 118 {} 119 #pragma omp target parallel private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}} 120 #pragma omp parallel 121 { 122 int v = 0; 123 int i; 124 } 125 #pragma omp target parallel shared(i) 126 {} 127 #pragma omp target parallel private(i) 128 {} 129 #pragma omp target parallel private(j) 130 {} 131 #pragma omp target parallel private(i) 132 {} 133 static int si; 134 #pragma omp target parallel private(si) // OK 135 {} 136 return 0; 137 } 138 139 void bar(S4 a[2]) { 140 #pragma omp parallel 141 #pragma omp target parallel private(a) 142 {} 143 } 144 145 int main(int argc, char **argv) { 146 const int d = 5; // expected-note {{constant variable is predetermined as shared}} 147 const int da[5] = { 0 }; // expected-note {{constant variable is predetermined as shared}} 148 S4 e(4); 149 S5 g[] = {5, 6}; 150 int i; 151 int &j = i; 152 #pragma omp target parallel private // expected-error {{expected '(' after 'private'}} 153 {} 154 #pragma omp target parallel private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 155 {} 156 #pragma omp target parallel private() // expected-error {{expected expression}} 157 {} 158 #pragma omp target parallel private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} 159 {} 160 #pragma omp target parallel private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 161 {} 162 #pragma omp target parallel private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 163 {} 164 #pragma omp target parallel private(argc argv) // expected-error {{expected ',' or ')' in 'private' clause}} 165 {} 166 #pragma omp target parallel private(argc) 167 {} 168 #pragma omp target parallel private(S1) // expected-error {{'S1' does not refer to a value}} 169 {} 170 #pragma omp target parallel private(a, b) // expected-error {{private variable with incomplete type 'S1'}} 171 {} 172 #pragma omp target parallel private (a, b, c, d, f) // expected-error {{a private variable with incomplete type 'S1'}} expected-error 3 {{shared variable cannot be private}} 173 {} 174 #pragma omp target parallel private(argv[1]) // expected-error {{expected variable name}} 175 {} 176 #pragma omp target parallel private(ba) 177 {} 178 #pragma omp target parallel private(ca) // expected-error {{shared variable cannot be private}} 179 {} 180 #pragma omp target parallel private(da) // expected-error {{shared variable cannot be private}} 181 {} 182 #pragma omp target parallel private(S2::S2s) // expected-error {{shared variable cannot be private}} 183 {} 184 #pragma omp target parallel private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} 185 {} 186 #pragma omp target parallel private(threadvar, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}} 187 {} 188 #pragma omp target parallel shared(i), private(i) // expected-error {{shared variable cannot be private}} expected-note {{defined as shared}} 189 foo(); 190 #pragma omp target parallel firstprivate(i) private(i) // expected-error {{firstprivate variable cannot be private}} expected-note {{defined as firstprivate}} 191 foo(); 192 #pragma omp target parallel private(i) 193 {} 194 #pragma omp target parallel private(j) 195 foo(); 196 #pragma omp parallel firstprivate(i) 197 for (int k = 0; k < 10; ++k) { 198 #pragma omp target parallel private(i) 199 foo(); 200 } 201 static int m; 202 #pragma omp target parallel private(m) // OK 203 foo(); 204 #pragma omp target parallel private(h) // expected-error {{threadprivate or thread local variable cannot be private}} 205 {} 206 #pragma omp target parallel private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}} 207 #pragma omp parallel 208 { 209 int i; 210 } 211 #pragma omp target parallel shared(i) 212 {} 213 #pragma omp target parallel private(i) 214 {} 215 #pragma omp target parallel private(j) 216 {} 217 #pragma omp target parallel private(i) 218 {} 219 static int si; 220 #pragma omp target parallel private(si) // OK 221 {} 222 return foomain<int, char, S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char, S4, S5>' requested here}} 223 } 224 225