Home | History | Annotate | Download | only in OpenMP
      1 // RUN: %clang_cc1 -verify -fopenmp -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 10 {{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;
     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 {{calling a private constructor of class 'S'}}
     57 #pragma omp task
     58   ++b;
     59 #pragma omp task
     60 // expected-error@+1 2 {{calling a private constructor of class 'S'}}
     61 #pragma omp parallel shared(a, b)
     62   ++a, ++b;
     63 // expected-note@+1 3 {{defined as reduction}}
     64 #pragma omp parallel reduction(+ : r)
     65 // expected-error@+1 {{argument of a reduction clause of a parallel construct must not appear in a firstprivate clause on a task construct}}
     66 #pragma omp task firstprivate(r)
     67   // expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}}
     68   ++r;
     69 // expected-note@+1 2 {{defined as reduction}}
     70 #pragma omp parallel reduction(+ : r)
     71 #pragma omp task default(shared)
     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
     77   // expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}}
     78   ++r;
     79 #pragma omp parallel
     80 // expected-note@+1 3 {{defined as reduction}}
     81 #pragma omp for reduction(+ : r)
     82   for (int i = 0; i < 10; ++i)
     83 // expected-error@+1 {{argument of a reduction clause of a for construct must not appear in a firstprivate clause on a task construct}}
     84 #pragma omp task firstprivate(r)
     85     // expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}}
     86     ++r;
     87 #pragma omp parallel
     88 // expected-note@+1 2 {{defined as reduction}}
     89 #pragma omp for reduction(+ : r)
     90   for (int i = 0; i < 10; ++i)
     91 #pragma omp task default(shared)
     92     // expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}}
     93     ++r;
     94 #pragma omp parallel
     95 // expected-note@+1 2 {{defined as reduction}}
     96 #pragma omp for reduction(+ : r)
     97   for (int i = 0; i < 10; ++i)
     98 #pragma omp task
     99     // expected-error@+1 2 {{reduction variables may not be accessed in an explicit task}}
    100     ++r;
    101 // expected-note@+1 {{non-shared variable in a task construct is predetermined as firstprivate}}
    102 #pragma omp task
    103 // expected-error@+2 {{reduction variable must be shared}}
    104 // expected-error@+1 {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
    105 #pragma omp for reduction(+ : r)
    106   ++r;
    107 // expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'untied' clause}}
    108 #pragma omp task untied untied
    109   ++r;
    110 // expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'mergeable' clause}}
    111 #pragma omp task mergeable mergeable
    112   ++r;
    113   return a + b;
    114 }
    115 
    116 int main(int argc, char **argv) {
    117   int a;
    118   int &b = a;
    119   S sa;
    120   S &sb = sa;
    121   int r;
    122 #pragma omp task { // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
    123   foo();
    124 #pragma omp task( // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
    125   foo();
    126 #pragma omp task[ // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
    127   foo();
    128 #pragma omp task] // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
    129   foo();
    130 #pragma omp task) // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
    131   foo();
    132 #pragma omp task } // expected-warning {{extra tokens at the end of '#pragma omp task' are ignored}}
    133   foo();
    134 #pragma omp task
    135 // expected-warning@+1 {{extra tokens at the end of '#pragma omp task' are ignored}}
    136 #pragma omp task unknown()
    137   foo();
    138 L1:
    139   foo();
    140 #pragma omp task
    141   ;
    142 #pragma omp task
    143   {
    144     goto L1; // expected-error {{use of undeclared label 'L1'}}
    145     argc++;
    146   }
    147 
    148   for (int i = 0; i < 10; ++i) {
    149     switch (argc) {
    150     case (0):
    151 #pragma omp task
    152     {
    153       foo();
    154       break;    // expected-error {{'break' statement not in loop or switch statement}}
    155       continue; // expected-error {{'continue' statement not in loop statement}}
    156     }
    157     default:
    158       break;
    159     }
    160   }
    161 #pragma omp task default(none)
    162   ++argc; // expected-error {{variable 'argc' must have explicitly specified data sharing attributes}}
    163 
    164   goto L2; // expected-error {{use of undeclared label 'L2'}}
    165 #pragma omp task
    166 L2:
    167   foo();
    168 #pragma omp task
    169   {
    170     return 1; // expected-error {{cannot return from OpenMP region}}
    171   }
    172 
    173   [[]] // expected-error {{an attribute list cannot appear here}}
    174 #pragma omp task
    175       for (int n = 0; n < 100; ++n) {
    176   }
    177 
    178 #pragma omp task default(none)
    179 #pragma omp task default(shared)
    180   ++a;
    181 #pragma omp task default(none)
    182 #pragma omp task
    183   ++a;
    184 #pragma omp task default(shared)
    185 #pragma omp task
    186   ++a;
    187 #pragma omp task
    188 #pragma omp parallel
    189   ++a;
    190 #pragma omp task
    191   ++b;
    192 #pragma omp task
    193 #pragma omp parallel shared(a, b)
    194   ++a, ++b;
    195 #pragma omp task default(none)
    196 #pragma omp task default(shared)
    197   ++sa;
    198 #pragma omp task default(none)
    199 #pragma omp task
    200   // expected-error@+1 {{calling a private constructor of class 'S'}}
    201   ++sa;
    202 #pragma omp task
    203 #pragma omp task
    204   // expected-error@+1 {{calling a private constructor of class 'S'}}
    205   ++sa;
    206 #pragma omp task default(shared)
    207 #pragma omp task
    208   ++sa;
    209 #pragma omp task
    210 #pragma omp parallel
    211   ++sa;
    212 // expected-error@+2 {{calling a private constructor of class 'S'}}
    213 #pragma omp task
    214   ++sb;
    215 // expected-error@+2 2 {{calling a private constructor of class 'S'}}
    216 #pragma omp task
    217 #pragma omp parallel shared(sa, sb)
    218   ++sa, ++sb;
    219 // expected-note@+1 2 {{defined as reduction}}
    220 #pragma omp parallel reduction(+ : r)
    221 // expected-error@+1 {{argument of a reduction clause of a parallel construct must not appear in a firstprivate clause on a task construct}}
    222 #pragma omp task firstprivate(r)
    223   // expected-error@+1 {{reduction variables may not be accessed in an explicit task}}
    224   ++r;
    225 // expected-note@+1 {{defined as reduction}}
    226 #pragma omp parallel reduction(+ : r)
    227 #pragma omp task default(shared)
    228   // expected-error@+1 {{reduction variables may not be accessed in an explicit task}}
    229   ++r;
    230 // expected-note@+1 {{defined as reduction}}
    231 #pragma omp parallel reduction(+ : r)
    232 #pragma omp task
    233   // expected-error@+1 {{reduction variables may not be accessed in an explicit task}}
    234   ++r;
    235 #pragma omp parallel
    236 // expected-note@+1 2 {{defined as reduction}}
    237 #pragma omp for reduction(+ : r)
    238   for (int i = 0; i < 10; ++i)
    239 // expected-error@+1 {{argument of a reduction clause of a for 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 #pragma omp parallel
    244 // expected-note@+1 {{defined as reduction}}
    245 #pragma omp for reduction(+ : r)
    246   for (int i = 0; i < 10; ++i)
    247 #pragma omp task default(shared)
    248     // expected-error@+1 {{reduction variables may not be accessed in an explicit task}}
    249     ++r;
    250 #pragma omp parallel
    251 // expected-note@+1 {{defined as reduction}}
    252 #pragma omp for reduction(+ : r)
    253   for (int i = 0; i < 10; ++i)
    254 #pragma omp task
    255     // expected-error@+1 {{reduction variables may not be accessed in an explicit task}}
    256     ++r;
    257 // expected-note@+1 {{non-shared variable in a task construct is predetermined as firstprivate}}
    258 #pragma omp task
    259 // expected-error@+2 {{reduction variable must be shared}}
    260 // expected-error@+1 {{region cannot be closely nested inside 'task' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}}
    261 #pragma omp for reduction(+ : r)
    262   ++r;
    263 // expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'untied' clause}}
    264 #pragma omp task untied untied
    265   ++r;
    266 // expected-error@+1 {{directive '#pragma omp task' cannot contain more than one 'mergeable' clause}}
    267 #pragma omp task mergeable mergeable
    268   ++r;
    269   // expected-note@+2 {{in instantiation of function template specialization 'foo<int>' requested here}}
    270   // expected-note@+1 {{in instantiation of function template specialization 'foo<S>' requested here}}
    271   return foo<int>() + foo<S>();
    272 }
    273 
    274