| // RUN: %clang_cc1 -verify -fopenmp -ferror-limit 100 -std=c++11 -o - %s | 
 |  | 
 | // RUN: %clang_cc1 -verify -fopenmp-simd -ferror-limit 100 -std=c++11 -o - %s | 
 |  | 
 | void foo() { | 
 | } | 
 |  | 
 | #pragma omp task // expected-error {{unexpected OpenMP directive '#pragma omp task'}} | 
 |  | 
 | class S { | 
 |   S(const S &s) { a = s.a + 12; } // expected-note 10 {{implicitly declared private here}} | 
 |   int a; | 
 |  | 
 | public: | 
 |   S() : a(0) {} | 
 |   S(int a) : a(a) {} | 
 |   operator int() { return a; } | 
 |   S &operator++() { return *this; } | 
 |   S operator+(const S &) { return *this; } | 
 | }; | 
 |  | 
 | class S1 { | 
 |   int a; | 
 |  | 
 | public: | 
 |   S1() : a(0) {} | 
 |   S1 &operator++() { return *this; } | 
 |   S1(const S1 &) = delete; // expected-note 2 {{'S1' has been explicitly marked deleted here}} | 
 | }; | 
 |  | 
 | template <class T> | 
 | int foo() { | 
 |   T a; | 
 |   T &b = a; | 
 |   int r; | 
 |   S1 s1; | 
 | // expected-error@+1 2 {{call to deleted constructor of 'S1'}} | 
 | #pragma omp task | 
 | // expected-note@+1 2 {{predetermined as a firstprivate in a task construct here}} | 
 |   ++s1; | 
 | #pragma omp task default(none) | 
 | #pragma omp task default(shared) | 
 |   ++a; | 
 | #pragma omp task default(none) | 
 | #pragma omp task | 
 |   // expected-error@+1 {{calling a private constructor of class 'S'}} | 
 |   ++a; | 
 | #pragma omp task | 
 | #pragma omp task | 
 |   // expected-error@+1 {{calling a private constructor of class 'S'}} | 
 |   ++a; | 
 | #pragma omp task default(shared) | 
 | #pragma omp task | 
 |   ++a; | 
 | #pragma omp task | 
 | #pragma omp parallel | 
 |   ++a; | 
 | // expected-error@+2 {{calling a private constructor of class 'S'}} | 
 | #pragma omp task | 
 |   ++b; | 
 | #pragma omp task | 
 | // expected-error@+1 2 {{calling a private constructor of class 'S'}} | 
 | #pragma omp parallel shared(a, b) | 
 |   ++a, ++b; | 
 | // expected-note@+1 2 {{defined as reduction}} | 
 | #pragma omp parallel reduction(+ : r) | 
 | // expected-error@+1 2 {{argument of a reduction clause of a parallel construct must not appear in a firstprivate clause on a task construct}} | 
 | #pragma omp task firstprivate(r) | 
 |   ++r; | 
 | // expected-note@+1 2 {{defined as reduction}} | 
 | #pragma omp parallel reduction(+ : r) | 
 | #pragma omp task default(shared) | 
 |   // expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}} | 
 |   ++r; | 
 | // expected-note@+1 2 {{defined as reduction}} | 
 | #pragma omp parallel reduction(+ : r) | 
 | #pragma omp task | 
 |   // expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}} | 
 |   ++r; | 
 | #pragma omp parallel | 
 | // expected-note@+1 2 {{defined as reduction}} | 
 | #pragma omp for reduction(+ : r) | 
 |   for (int i = 0; i < 10; ++i) | 
 | // expected-error@+1 2 {{argument of a reduction clause of a for construct must not appear in a firstprivate clause on a task construct}} | 
 | #pragma omp task firstprivate(r) | 
 |     ++r; | 
 | #pragma omp parallel | 
 | // expected-note@+1 2 {{defined as reduction}} | 
 | #pragma omp for reduction(+ : r) | 
 |   for (int i = 0; i < 10; ++i) | 
 | #pragma omp task default(shared) | 
 |     // expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}} | 
 |     ++r; | 
 | #pragma omp parallel | 
 | // expected-note@+1 2 {{defined as reduction}} | 
 | #pragma omp for reduction(+ : r) | 
 |   for (int i = 0; i < 10; ++i) | 
 | #pragma omp task | 
 |     // expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}} | 
 |     ++r; | 
 | // expected-note@+1 {{non-shared variable in a task construct is predetermined as firstprivate}} | 
 | #pragma omp task | 
 | // expected-error@+2 {{reduction variable must be shared}} | 
 | // expected-error@+1 {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} | 
 | #pragma omp for reduction(+ : r) | 
 |   ++r; | 
 | // expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'untied' clause}} | 
 | #pragma omp task untied untied | 
 |   ++r; | 
 | // expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'mergeable' clause}} | 
 | #pragma omp task mergeable mergeable | 
 |   ++r; | 
 |   return a + b; | 
 | } | 
 |  | 
 | int main(int argc, char **argv) { | 
 |   int a; | 
 |   int &b = a; | 
 |   S sa; | 
 |   S &sb = sa; | 
 |   int r; | 
 | #pragma omp task { // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}} | 
 |   foo(); | 
 | #pragma omp task( // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}} | 
 |   foo(); | 
 | #pragma omp task[ // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}} | 
 |   foo(); | 
 | #pragma omp task] // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}} | 
 |   foo(); | 
 | #pragma omp task) // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}} | 
 |   foo(); | 
 | #pragma omp task } // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}} | 
 |   foo(); | 
 | #pragma omp task | 
 | // expected-warning@+1 {{extra tokens at the end of '#pragma omp task' are ignored}} | 
 | #pragma omp task unknown() | 
 |   foo(); | 
 | L1: | 
 |   foo(); | 
 | #pragma omp task | 
 |   ; | 
 | #pragma omp task | 
 |   { | 
 |     goto L1; // expected-error {{use of undeclared label 'L1'}} | 
 |     argc++; | 
 |   } | 
 |  | 
 |   for (int i = 0; i < 10; ++i) { | 
 |     switch (argc) { | 
 |     case (0): | 
 | #pragma omp task | 
 |     { | 
 |       foo(); | 
 |       break;    // expected-error {{'break' statement not in loop or switch statement}} | 
 |       continue; // expected-error {{'continue' statement not in loop statement}} | 
 |     } | 
 |     default: | 
 |       break; | 
 |     } | 
 |   } | 
 | #pragma omp task default(none) | 
 |   ++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}} | 
 |  | 
 |   goto L2; // expected-error {{use of undeclared label 'L2'}} | 
 | #pragma omp task | 
 | L2: | 
 |   foo(); | 
 | #pragma omp task | 
 |   { | 
 |     return 1; // expected-error {{cannot return from OpenMP region}} | 
 |   } | 
 |  | 
 |   [[]] // expected-error {{an attribute list cannot appear here}} | 
 | #pragma omp task | 
 |       for (int n = 0; n < 100; ++n) { | 
 |   } | 
 |  | 
 | #pragma omp task default(none) | 
 | #pragma omp task default(shared) | 
 |   ++a; | 
 | #pragma omp task default(none) | 
 | #pragma omp task | 
 |   ++a; | 
 | #pragma omp task default(shared) | 
 | #pragma omp task | 
 |   ++a; | 
 | #pragma omp task | 
 | #pragma omp parallel | 
 |   ++a; | 
 | #pragma omp task | 
 |   ++b; | 
 | #pragma omp task | 
 | #pragma omp parallel shared(a, b) | 
 |   ++a, ++b; | 
 | #pragma omp task default(none) | 
 | #pragma omp task default(shared) | 
 |   ++sa; | 
 | #pragma omp task default(none) | 
 | #pragma omp task | 
 |   // expected-error@+1 {{calling a private constructor of class 'S'}} | 
 |   ++sa; | 
 | #pragma omp task | 
 | #pragma omp task | 
 |   // expected-error@+1 {{calling a private constructor of class 'S'}} | 
 |   ++sa; | 
 | #pragma omp task default(shared) | 
 | #pragma omp task | 
 |   ++sa; | 
 | #pragma omp task | 
 | #pragma omp parallel | 
 |   ++sa; | 
 | // expected-error@+2 {{calling a private constructor of class 'S'}} | 
 | #pragma omp task | 
 |   ++sb; | 
 | // expected-error@+2 2 {{calling a private constructor of class 'S'}} | 
 | #pragma omp task | 
 | #pragma omp parallel shared(sa, sb) | 
 |   ++sa, ++sb; | 
 | // expected-note@+1 2 {{defined as reduction}} | 
 | #pragma omp parallel reduction(+ : r) | 
 | // expected-error@+1 {{argument of a reduction clause of a parallel construct must not appear in a firstprivate clause on a task construct}} | 
 | #pragma omp task firstprivate(r) | 
 |   // expected-error@+1 {{reduction variables may not be accessed in an explicit task}} | 
 |   ++r; | 
 | // expected-note@+1 {{defined as reduction}} | 
 | #pragma omp parallel reduction(+ : r) | 
 | #pragma omp task default(shared) | 
 |   // expected-error@+1 {{reduction variables may not be accessed in an explicit task}} | 
 |   ++r; | 
 | // expected-note@+1 {{defined as reduction}} | 
 | #pragma omp parallel reduction(+ : r) | 
 | #pragma omp task | 
 |   // expected-error@+1 {{reduction variables may not be accessed in an explicit task}} | 
 |   ++r; | 
 | #pragma omp parallel | 
 | // expected-note@+1 2 {{defined as reduction}} | 
 | #pragma omp for reduction(+ : r) | 
 |   for (int i = 0; i < 10; ++i) | 
 | // expected-error@+1 {{argument of a reduction clause of a for construct must not appear in a firstprivate clause on a task construct}} | 
 | #pragma omp task firstprivate(r) | 
 |     // expected-error@+1 {{reduction variables may not be accessed in an explicit task}} | 
 |     ++r; | 
 | #pragma omp parallel | 
 | // expected-note@+1 {{defined as reduction}} | 
 | #pragma omp for reduction(+ : r) | 
 |   for (int i = 0; i < 10; ++i) | 
 | #pragma omp task default(shared) | 
 |     // expected-error@+1 {{reduction variables may not be accessed in an explicit task}} | 
 |     ++r; | 
 | #pragma omp parallel | 
 | // expected-note@+1 {{defined as reduction}} | 
 | #pragma omp for reduction(+ : r) | 
 |   for (int i = 0; i < 10; ++i) | 
 | #pragma omp task | 
 |     // expected-error@+1 {{reduction variables may not be accessed in an explicit task}} | 
 |     ++r; | 
 | // expected-note@+1 {{non-shared variable in a task construct is predetermined as firstprivate}} | 
 | #pragma omp task | 
 | // expected-error@+2 {{reduction variable must be shared}} | 
 | // expected-error@+1 {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} | 
 | #pragma omp for reduction(+ : r) | 
 |   ++r; | 
 | // expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'untied' clause}} | 
 | #pragma omp task untied untied | 
 |   ++r; | 
 | // expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'mergeable' clause}} | 
 | #pragma omp task mergeable mergeable | 
 |   ++r; | 
 |   // expected-note@+2 {{in instantiation of function template specialization 'foo<int>' requested here}} | 
 |   // expected-note@+1 {{in instantiation of function template specialization 'foo<S>' requested here}} | 
 |   return foo<int>() + foo<S>(); | 
 | } | 
 |  |