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