1 // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -std=c++11 -o - %s 2 3 // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -std=c++11 -o - %s 4 5 void foo() { 6 } 7 8 #pragma omp task // expected-error {{unexpected OpenMP directive '#pragma omp task'}} 9 10 class S { 11 S(const S &s) { a = s.a + 12; } // expected-note 16 {{implicitly declared private here}} 12 int a; 13 14 public: 15 S() : a(0) {} 16 S(int a) : a(a) {} 17 operator int() { return a; } 18 S &operator++() { return *this; } 19 S operator+(const S &) { return *this; } 20 }; 21 22 class S1 { 23 int a; 24 25 public: 26 S1() : a(0) {} 27 S1 &operator++() { return *this; } 28 S1(const S1 &) = delete; // expected-note 2 {{'S1' has been explicitly marked deleted here}} 29 }; 30 31 template <class T> 32 int foo() { 33 T a; 34 T &b = a; 35 int r; 36 S1 s1; 37 // expected-error@+1 2 {{call to deleted constructor of 'S1'}} 38 #pragma omp task 39 // expected-note@+1 2 {{predetermined as a firstprivate in a task construct here}} 40 ++s1; 41 #pragma omp task default(none) // expected-note 2 {{explicit data sharing attribute requested here}} 42 #pragma omp task default(shared) 43 ++a; // expected-error 2 {{variable 'a' must have explicitly specified data sharing attributes}} 44 #pragma omp task default(none) // expected-note 2 {{explicit data sharing attribute requested here}} 45 #pragma omp task 46 // expected-error@+1 {{calling a private constructor of class 'S'}} 47 ++a; // expected-error 2 {{variable 'a' must have explicitly specified data sharing attributes}} 48 #pragma omp task 49 #pragma omp task 50 // expected-error@+1 {{calling a private constructor of class 'S'}} 51 ++a; // expected-error {{calling a private constructor of class 'S'}} 52 #pragma omp task default(shared) 53 #pragma omp task 54 // expected-error@+1 {{calling a private constructor of class 'S'}} 55 ++a; 56 #pragma omp parallel shared(a) 57 #pragma omp task 58 #pragma omp task 59 ++a; 60 #pragma omp parallel shared(a) 61 #pragma omp task default(shared) 62 #pragma omp task 63 ++a; 64 #pragma omp task 65 #pragma omp parallel 66 ++a; // expected-error {{calling a private constructor of class 'S'}} 67 // expected-error@+2 {{calling a private constructor of class 'S'}} 68 #pragma omp task 69 ++b; 70 #pragma omp task 71 // expected-error@+1 2 {{calling a private constructor of class 'S'}} 72 #pragma omp parallel shared(a, b) 73 ++a, ++b; 74 // expected-note@+1 2 {{defined as reduction}} 75 #pragma omp parallel reduction(+ : r) 76 // expected-error@+1 2 {{argument of a reduction clause of a parallel construct must not appear in a firstprivate clause on a task construct}} 77 #pragma omp task firstprivate(r) 78 ++r; 79 // expected-note@+1 2 {{defined as reduction}} 80 #pragma omp parallel reduction(+ : r) 81 #pragma omp task default(shared) 82 // expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}} 83 ++r; 84 // expected-note@+1 2 {{defined as reduction}} 85 #pragma omp parallel reduction(+ : r) 86 #pragma omp task 87 // expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}} 88 ++r; 89 #pragma omp parallel 90 // expected-note@+1 2 {{defined as reduction}} 91 #pragma omp for reduction(+ : r) 92 for (int i = 0; i < 10; ++i) 93 // expected-error@+1 2 {{argument of a reduction clause of a for construct must not appear in a firstprivate clause on a task construct}} 94 #pragma omp task firstprivate(r) 95 ++r; 96 #pragma omp parallel 97 // expected-note@+1 2 {{defined as reduction}} 98 #pragma omp for reduction(+ : r) 99 for (int i = 0; i < 10; ++i) 100 #pragma omp task default(shared) 101 // expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}} 102 ++r; 103 #pragma omp parallel 104 // expected-note@+1 2 {{defined as reduction}} 105 #pragma omp for reduction(+ : r) 106 for (int i = 0; i < 10; ++i) 107 #pragma omp task 108 // expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}} 109 ++r; 110 // expected-note@+1 {{non-shared variable in a task construct is predetermined as firstprivate}} 111 #pragma omp task 112 // expected-error@+2 {{reduction variable must be shared}} 113 // expected-error@+1 {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 114 #pragma omp for reduction(+ : r) 115 ++r; 116 // expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'untied' clause}} 117 #pragma omp task untied untied 118 ++r; 119 // expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'mergeable' clause}} 120 #pragma omp task mergeable mergeable 121 ++r; 122 return a + b; 123 } 124 125 int main(int argc, char **argv) { 126 int a; 127 int &b = a; 128 S sa; 129 S &sb = sa; 130 int r; 131 #pragma omp task { // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}} 132 foo(); 133 #pragma omp task( // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}} 134 foo(); 135 #pragma omp task[ // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}} 136 foo(); 137 #pragma omp task] // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}} 138 foo(); 139 #pragma omp task) // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}} 140 foo(); 141 #pragma omp task } // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}} 142 foo(); 143 #pragma omp task 144 // expected-warning@+1 {{extra tokens at the end of '#pragma omp task' are ignored}} 145 #pragma omp task unknown() 146 foo(); 147 L1: 148 foo(); 149 #pragma omp task 150 ; 151 #pragma omp task 152 { 153 goto L1; // expected-error {{use of undeclared label 'L1'}} 154 argc++; 155 } 156 157 for (int i = 0; i < 10; ++i) { 158 switch (argc) { 159 case (0): 160 #pragma omp task 161 { 162 foo(); 163 break; // expected-error {{'break' statement not in loop or switch statement}} 164 continue; // expected-error {{'continue' statement not in loop statement}} 165 } 166 default: 167 break; 168 } 169 } 170 #pragma omp task default(none) // expected-note {{explicit data sharing attribute requested here}} 171 ++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}} 172 173 goto L2; // expected-error {{use of undeclared label 'L2'}} 174 #pragma omp task 175 L2: 176 foo(); 177 #pragma omp task 178 { 179 return 1; // expected-error {{cannot return from OpenMP region}} 180 } 181 182 [[]] // expected-error {{an attribute list cannot appear here}} 183 #pragma omp task 184 for (int n = 0; n < 100; ++n) { 185 } 186 187 #pragma omp task default(none) // expected-note {{explicit data sharing attribute requested here}} 188 #pragma omp task default(shared) 189 ++a; // expected-error {{variable 'a' must have explicitly specified data sharing attributes}} 190 #pragma omp task default(none) // expected-note {{explicit data sharing attribute requested here}} 191 #pragma omp task 192 ++a; // expected-error {{variable 'a' must have explicitly specified data sharing attributes}} 193 #pragma omp task default(shared) 194 #pragma omp task 195 ++a; 196 #pragma omp task 197 #pragma omp parallel 198 ++a; 199 #pragma omp task 200 ++b; 201 #pragma omp task 202 #pragma omp parallel shared(a, b) 203 ++a, ++b; 204 #pragma omp task default(none) // expected-note {{explicit data sharing attribute requested here}} 205 #pragma omp task default(shared) 206 ++sa; // expected-error {{variable 'sa' must have explicitly specified data sharing attributes}} 207 #pragma omp task default(none) // expected-note {{explicit data sharing attribute requested here}} 208 #pragma omp task 209 // expected-error@+1 {{calling a private constructor of class 'S'}} 210 ++sa; // expected-error {{variable 'sa' must have explicitly specified data sharing attributes}} 211 #pragma omp task 212 #pragma omp task 213 // expected-error@+1 {{calling a private constructor of class 'S'}} 214 ++sa; // expected-error {{calling a private constructor of class 'S'}} 215 #pragma omp task default(shared) 216 #pragma omp task 217 // expected-error@+1 {{calling a private constructor of class 'S'}} 218 ++sa; 219 #pragma omp parallel shared(sa) 220 #pragma omp task 221 #pragma omp task 222 ++sa; 223 #pragma omp parallel shared(sa) 224 #pragma omp task default(shared) 225 #pragma omp task 226 ++sa; 227 #pragma omp task 228 #pragma omp parallel 229 ++sa; // expected-error {{calling a private constructor of class 'S'}} 230 // expected-error@+2 {{calling a private constructor of class 'S'}} 231 #pragma omp task 232 ++sb; 233 // expected-error@+2 2 {{calling a private constructor of class 'S'}} 234 #pragma omp task 235 #pragma omp parallel shared(sa, sb) 236 ++sa, ++sb; 237 // expected-note@+1 2 {{defined as reduction}} 238 #pragma omp parallel reduction(+ : r) 239 // expected-error@+1 {{argument of a reduction clause of a parallel construct must not appear in a firstprivate clause on a task construct}} 240 #pragma omp task firstprivate(r) 241 // expected-error@+1 {{reduction variables may not be accessed in an explicit task}} 242 ++r; 243 // expected-note@+1 {{defined as reduction}} 244 #pragma omp parallel reduction(+ : r) 245 #pragma omp task default(shared) 246 // expected-error@+1 {{reduction variables may not be accessed in an explicit task}} 247 ++r; 248 // expected-note@+1 {{defined as reduction}} 249 #pragma omp parallel reduction(+ : r) 250 #pragma omp task 251 // expected-error@+1 {{reduction variables may not be accessed in an explicit task}} 252 ++r; 253 #pragma omp parallel 254 // expected-note@+1 2 {{defined as reduction}} 255 #pragma omp for reduction(+ : r) 256 for (int i = 0; i < 10; ++i) 257 // expected-error@+1 {{argument of a reduction clause of a for construct must not appear in a firstprivate clause on a task construct}} 258 #pragma omp task firstprivate(r) 259 // expected-error@+1 {{reduction variables may not be accessed in an explicit task}} 260 ++r; 261 #pragma omp parallel 262 // expected-note@+1 {{defined as reduction}} 263 #pragma omp for reduction(+ : r) 264 for (int i = 0; i < 10; ++i) 265 #pragma omp task default(shared) 266 // expected-error@+1 {{reduction variables may not be accessed in an explicit task}} 267 ++r; 268 #pragma omp parallel 269 // expected-note@+1 {{defined as reduction}} 270 #pragma omp for reduction(+ : r) 271 for (int i = 0; i < 10; ++i) 272 #pragma omp task 273 // expected-error@+1 {{reduction variables may not be accessed in an explicit task}} 274 ++r; 275 // expected-note@+1 {{non-shared variable in a task construct is predetermined as firstprivate}} 276 #pragma omp task 277 // expected-error@+2 {{reduction variable must be shared}} 278 // expected-error@+1 {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} 279 #pragma omp for reduction(+ : r) 280 ++r; 281 // expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'untied' clause}} 282 #pragma omp task untied untied 283 ++r; 284 // expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'mergeable' clause}} 285 #pragma omp task mergeable mergeable 286 ++r; 287 // expected-note@+2 {{in instantiation of function template specialization 'foo<int>' requested here}} 288 // expected-note@+1 {{in instantiation of function template specialization 'foo<S>' requested here}} 289 return foo<int>() + foo<S>(); 290 } 291 292