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