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