1 // RUN: %clang_cc1 -verify=expected,le45 -fopenmp -ferror-limit 100 %s -Wno-openmp-mapping -Wuninitialized 2 // RUN: %clang_cc1 -verify=expected,le45 -fopenmp -fopenmp-version=40 -ferror-limit 100 %s -Wno-openmp-mapping -Wuninitialized 3 // RUN: %clang_cc1 -verify=expected,le45 -fopenmp -fopenmp-version=45 -ferror-limit 100 %s -Wno-openmp-mapping -Wuninitialized 4 // RUN: %clang_cc1 -verify=expected,le50 -fopenmp -fopenmp-version=50 -ferror-limit 100 %s -Wno-openmp-mapping -Wuninitialized 5 6 // RUN: %clang_cc1 -verify=expected,le45 -fopenmp-simd -ferror-limit 100 %s -Wno-openmp-mapping -Wuninitialized 7 8 void foo() { 9 } 10 11 bool foobool(int argc) { 12 return argc; 13 } 14 15 struct S1; // expected-note 2 {{declared here}} 16 extern S1 a; 17 class S2 { 18 mutable int a; 19 public: 20 S2():a(0) { } 21 S2(S2 &s2):a(s2.a) { } 22 static float S2s; 23 static const float S2sc; 24 }; 25 const float S2::S2sc = 0; 26 const S2 b; 27 const S2 ba[5]; 28 class S3 { 29 int a; 30 public: 31 S3():a(0) { } 32 S3(S3 &s3):a(s3.a) { } 33 }; 34 const S3 c; 35 const S3 ca[5]; 36 extern const int f; 37 class S4 { 38 int a; 39 S4(); 40 S4(const S4 &s4); 41 public: 42 S4(int v):a(v) { } 43 }; 44 class S5 { 45 int a; 46 S5():a(0) {} 47 S5(const S5 &s5):a(s5.a) { } 48 public: 49 S5(int v):a(v) { } 50 }; 51 struct S6 { 52 int ii; 53 int aa[30]; 54 float xx; 55 double *pp; 56 }; 57 struct S7 { 58 int i; 59 int a[50]; 60 float x; 61 S6 s6[5]; 62 double *p; 63 unsigned bfa : 4; 64 }; 65 struct S8 { 66 int *ptr; 67 int a; 68 struct S7* S; 69 void foo() { 70 #pragma omp target update from(*this) // le45-error {{expected expression containing only member accesses and/or array sections based on named variables}} le45-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 71 {} 72 #pragma omp target update from(*(this->ptr)) // le45-error {{expected expression containing only member accesses and/or array sections based on named variables}} le45-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 73 #pragma omp target update from(*(this->S->i+this->S->p)) // le45-error {{expected expression containing only member accesses and/or array sections based on named variables}} le45-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 74 #pragma omp target update from(*(this->S->i+this->S->s6[0].pp)) // le45-error {{expected expression containing only member accesses and/or array sections based on named variables}} le45-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 75 #pragma omp target update from(*(a+this->ptr)) // le45-error {{expected expression containing only member accesses and/or array sections based on named variables}} le45-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 76 #pragma omp target update from(*(*(this->ptr)+a+this->ptr)) // le45-error {{expected expression containing only member accesses and/or array sections based on named variables}} le45-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 77 #pragma omp target update from(*(this+this)) // expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} expected-error {{invalid operands to binary expression ('S8 *' and 'S8 *')}} 78 } 79 }; 80 81 S3 h; 82 #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}} 83 84 typedef int to; 85 86 template <typename T, int I> // expected-note {{declared here}} 87 T tmain(T argc) { 88 const T d = 5; 89 const T da[5] = { 0 }; 90 S4 e(4); 91 S5 g(5); 92 T i, t[20]; 93 T &j = i; 94 T *k = &j; 95 T x; 96 T y; 97 T from; 98 const T (&l)[5] = da; 99 T *m; 100 S7 s7; 101 102 #pragma omp target update from // expected-error {{expected '(' after 'from'}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 103 #pragma omp target update from( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 104 #pragma omp target update from() // expected-error {{expected expression}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 105 #pragma omp target update() // expected-warning {{extra tokens at the end of '#pragma omp target update' are ignored}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 106 #pragma omp target update from(alloc) // expected-error {{use of undeclared identifier 'alloc'}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 107 #pragma omp target update from(x) 108 #pragma omp target update from(t[:I]) 109 #pragma omp target update from(T) // expected-error {{'T' does not refer to a value}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 110 #pragma omp target update from(I) // le50-error 2 {{expected addressable lvalue in 'from' clause}} le45-error 2 {{expected expression containing only member accesses and/or array sections based on named variables}} 111 #pragma omp target update from(S2::S2s) 112 #pragma omp target update from(S2::S2sc) 113 #pragma omp target update from(from) 114 #pragma omp target update from(y x) // expected-error {{expected ',' or ')' in 'from' clause}} 115 #pragma omp target update from(argc > 0 ? x : y) // le50-error 2 {{expected addressable lvalue in 'from' clause}} le45-error 2 {{expected expression containing only member accesses and/or array sections based on named variables}} 116 117 #pragma omp target update from(S1) // expected-error {{'S1' does not refer to a value}}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 118 #pragma omp target update from(a, b, c, d, f) // expected-error {{incomplete type 'S1' where a complete type is required}} 119 #pragma omp target update from(ba) 120 #pragma omp target update from(h) // expected-error {{threadprivate variables are not allowed in 'from' clause}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 121 #pragma omp target update from(k), to(k) // expected-error 2 {{variable can appear only once in OpenMP 'target update' construct}} expected-note 2 {{used here}} 122 #pragma omp target update from(t), from(t[:5]) // expected-error 2 {{variable can appear only once in OpenMP 'target update' construct}} expected-note 2 {{used here}} 123 #pragma omp target update from(da) 124 #pragma omp target update from(da[:4]) 125 126 #pragma omp target update from(x, a[:2]) // expected-error {{subscripted value is not an array or pointer}} 127 #pragma omp target update from(x, c[:]) // expected-error {{subscripted value is not an array or pointer}} 128 #pragma omp target update from(x, (m+1)[2]) // le45-error 2 {{expected expression containing only member accesses and/or array sections based on named variables}} 129 #pragma omp target update from(s7.i, s7.a[:3]) 130 #pragma omp target update from(s7.s6[1].aa[0:5]) 131 #pragma omp target update from(x, s7.s6[:5].aa[6]) // expected-error {{OpenMP array section is not allowed here}} 132 #pragma omp target update from(x, s7.s6[:5].aa[:6]) // expected-error {{OpenMP array section is not allowed here}} 133 #pragma omp target update from(s7.p[:10]) 134 #pragma omp target update from(x, s7.bfa) // expected-error {{bit fields cannot be used to specify storage in a 'from' clause}} 135 #pragma omp target update from(x, s7.p[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}} 136 #pragma omp target data map(to: s7.i) 137 { 138 #pragma omp target update from(s7.x) 139 } 140 141 return 0; 142 } 143 144 int main(int argc, char **argv) { 145 const int d = 5; 146 const int da[5] = { 0 }; 147 S4 e(4); 148 S5 g(5); 149 int i, t[20]; 150 int &j = i; 151 int *k = &j; 152 int x; 153 int y; 154 int from; 155 const int (&l)[5] = da; 156 int *m; 157 S7 s7; 158 int **BB, *offset; 159 int ***BBB; 160 161 #pragma omp target update from // expected-error {{expected '(' after 'from'}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 162 #pragma omp target update from( // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{expected expression}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 163 #pragma omp target update from() // expected-error {{expected expression}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 164 #pragma omp target update() // expected-warning {{extra tokens at the end of '#pragma omp target update' are ignored}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 165 #pragma omp target update from(alloc) // expected-error {{use of undeclared identifier 'alloc'}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 166 #pragma omp target update from(x) 167 #pragma omp target update from(t[:i]) 168 #pragma omp target update from(S2::S2s) 169 #pragma omp target update from(S2::S2sc) 170 #pragma omp target update from(from) 171 #pragma omp target update from(y x) // expected-error {{expected ',' or ')' in 'from' clause}} 172 #pragma omp target update from(argc > 0 ? x : y) // le50-error {{expected addressable lvalue in 'from' clause}} le45-error {{expected expression containing only member accesses and/or array sections based on named variables}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 173 #pragma omp target update from(S1) // expected-error {{'S1' does not refer to a value}}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 174 #pragma omp target update from(a, b, c, d, f) // expected-error {{incomplete type 'S1' where a complete type is required}} 175 #pragma omp target update from(ba) 176 #pragma omp target update from(h) // expected-error {{threadprivate variables are not allowed in 'from' clause}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 177 #pragma omp target update from(k), to(k) // expected-error {{variable can appear only once in OpenMP 'target update' construct}} expected-note {{used here}} 178 #pragma omp target update from(t), from(t[:5]) // expected-error {{variable can appear only once in OpenMP 'target update' construct}} expected-note {{used here}} 179 #pragma omp target update from(da) 180 #pragma omp target update from(da[:4]) 181 182 #pragma omp target update from(x, a[:2]) // expected-error {{subscripted value is not an array or pointer}} 183 #pragma omp target update from(x, c[:]) // expected-error {{subscripted value is not an array or pointer}} 184 #pragma omp target update from(x, (m+1)[2]) // // le45-error {{expected expression containing only member accesses and/or array sections based on named variables}} 185 #pragma omp target update from(s7.i, s7.a[:3]) 186 #pragma omp target update from(s7.s6[1].aa[0:5]) 187 #pragma omp target update from(x, s7.s6[:5].aa[6]) // expected-error {{OpenMP array section is not allowed here}} 188 #pragma omp target update from(x, s7.s6[:5].aa[:6]) // expected-error {{OpenMP array section is not allowed here}} 189 #pragma omp target update from(s7.p[:10]) 190 #pragma omp target update from(x, s7.bfa) // expected-error {{bit fields cannot be used to specify storage in a 'from' clause}} 191 #pragma omp target update from(x, s7.p[:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}} 192 #pragma omp target update from(**(BB+*offset)) // le45-error {{expected expression containing only member accesses and/or array sections based on named variables}} le45-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 193 #pragma omp target update from(**(BB+y)) // le45-error {{expected expression containing only member accesses and/or array sections based on named variables}} le45-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 194 #pragma omp target update from(*(m+*offset)) // le45-error {{expected expression containing only member accesses and/or array sections based on named variables}} le45-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 195 #pragma omp target update from(**(*offset+BB)) // le45-error {{expected expression containing only member accesses and/or array sections based on named variables}} le45-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 196 #pragma omp target update from(**(y+BB)) // le45-error {{expected expression containing only member accesses and/or array sections based on named variables}} le45-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 197 #pragma omp target update from(*(*offset+m)) // le45-error {{expected expression containing only member accesses and/or array sections based on named variables}} le45-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 198 #pragma omp target update from(**(-(*offset)+BB+*m)) // le45-error {{expected expression containing only member accesses and/or array sections based on named variables}} le45-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 199 #pragma omp target update from(**(*(*(&offset))+BB-*m)) // le45-error {{expected expression containing only member accesses and/or array sections based on named variables}} le45-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 200 #pragma omp target update from(*(x+*(y+*(**BB+BBB)+s7.i))) // le45-error {{expected expression containing only member accesses and/or array sections based on named variables}} le45-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 201 #pragma omp target update from(*(m+(m))) // expected-error {{invalid operands to binary expression ('int *' and 'int *')}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 202 #pragma omp target update from(*(1+y+y)) // expected-error {{indirection requires pointer operand ('int' invalid)}} expected-error {{expected at least one 'to' clause or 'from' clause specified to '#pragma omp target update'}} 203 #pragma omp target data map(to: s7.i) 204 { 205 #pragma omp target update from(s7.x) 206 } 207 208 return tmain<int, 3>(argc)+tmain<to, 4>(argc); // expected-note {{in instantiation of function template specialization 'tmain<int, 3>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<int, 4>' requested here}} 209 } 210 211