Home | History | Annotate | Download | only in OpenMP
      1 // RUN: %clang_cc1 -verify -fopenmp %s
      2 
      3 void foo() {
      4 }
      5 
      6 bool foobool(int argc) {
      7   return argc;
      8 }
      9 
     10 struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}
     11 extern S1 a;
     12 class S2 {
     13   mutable int a;
     14 
     15 public:
     16   S2() : a(0) {}
     17   S2(S2 &s2) : a(s2.a) {}
     18   S2 &operator =(const S2&);
     19   const S2 &operator =(const S2&) const;
     20   static float S2s; // expected-note {{static data member is predetermined as shared}}
     21   static const float S2sc;
     22 };
     23 const float S2::S2sc = 0; // expected-note {{static data member is predetermined as shared}}
     24 const S2 b;
     25 const S2 ba[5];
     26 class S3 {
     27   int a;
     28   S3 &operator=(const S3 &s3); // expected-note 2 {{implicitly declared private here}}
     29 
     30 public:
     31   S3() : a(0) {}
     32   S3(S3 &s3) : a(s3.a) {}
     33 };
     34 const S3 c;         // expected-note {{global variable is predetermined as shared}}
     35 const S3 ca[5];     // expected-note {{global variable is predetermined as shared}}
     36 extern const int f; // expected-note {{global variable is predetermined as shared}}
     37 class S4 {
     38   int a;
     39   S4();             // expected-note 3 {{implicitly declared private here}}
     40   S4(const S4 &s4);
     41 
     42 public:
     43   S4(int v) : a(v) {}
     44 };
     45 class S5 {
     46   int a;
     47   S5() : a(0) {} // expected-note {{implicitly declared private here}}
     48 
     49 public:
     50   S5(const S5 &s5) : a(s5.a) {}
     51   S5(int v) : a(v) {}
     52 };
     53 class S6 {
     54   int a;
     55   S6() : a(0) {}
     56 
     57 public:
     58   S6(const S6 &s6) : a(s6.a) {}
     59   S6(int v) : a(v) {}
     60 };
     61 
     62 S3 h;
     63 #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
     64 
     65 template <class I, class C>
     66 int foomain(int argc, char **argv) {
     67   I e(4);
     68   I g(5);
     69   int i;
     70   int &j = i;
     71 #pragma omp parallel
     72 #pragma omp for simd lastprivate // expected-error {{expected '(' after 'lastprivate'}}
     73   for (int k = 0; k < argc; ++k)
     74     ++k;
     75 #pragma omp parallel
     76 #pragma omp for simd lastprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
     77   for (int k = 0; k < argc; ++k)
     78     ++k;
     79 #pragma omp parallel
     80 #pragma omp for simd lastprivate() // expected-error {{expected expression}}
     81   for (int k = 0; k < argc; ++k)
     82     ++k;
     83 #pragma omp parallel
     84 #pragma omp for simd lastprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
     85   for (int k = 0; k < argc; ++k)
     86     ++k;
     87 #pragma omp parallel
     88 #pragma omp for simd lastprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
     89   for (int k = 0; k < argc; ++k)
     90     ++k;
     91 #pragma omp parallel
     92 #pragma omp for simd lastprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
     93   for (int k = 0; k < argc; ++k)
     94     ++k;
     95 #pragma omp parallel
     96 #pragma omp for simd lastprivate(argc)
     97   for (int k = 0; k < argc; ++k)
     98     ++k;
     99 #pragma omp parallel
    100 #pragma omp for simd lastprivate(S1) // expected-error {{'S1' does not refer to a value}}
    101   for (int k = 0; k < argc; ++k)
    102     ++k;
    103 #pragma omp parallel
    104 #pragma omp for simd lastprivate(a, b) // expected-error {{lastprivate variable with incomplete type 'S1'}}
    105   for (int k = 0; k < argc; ++k)
    106     ++k;
    107 #pragma omp parallel
    108 #pragma omp for simd lastprivate(argv[1]) // expected-error {{expected variable name}}
    109   for (int k = 0; k < argc; ++k)
    110     ++k;
    111 #pragma omp parallel
    112 #pragma omp for simd lastprivate(e, g) // expected-error 2 {{calling a private constructor of class 'S4'}}
    113   for (int k = 0; k < argc; ++k)
    114     ++k;
    115 #pragma omp parallel
    116 #pragma omp for simd lastprivate(h) // expected-error {{threadprivate or thread local variable cannot be lastprivate}}
    117   for (int k = 0; k < argc; ++k)
    118     ++k;
    119 #pragma omp parallel
    120 #pragma omp for simd
    121   for (int k = 0; k < argc; ++k)
    122     ++k;
    123 #pragma omp parallel
    124   {
    125     int v = 0;
    126     int i;                     // expected-note {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp for simd' directive into a parallel or another task region?}}
    127 #pragma omp for simd lastprivate(i) // expected-error {{lastprivate variable must be shared}}
    128     for (int k = 0; k < argc; ++k) {
    129       i = k;
    130       v += i;
    131     }
    132   }
    133 #pragma omp parallel shared(i)
    134 #pragma omp parallel private(i)
    135 #pragma omp for simd lastprivate(j)
    136   for (int k = 0; k < argc; ++k)
    137     ++k;
    138 #pragma omp parallel
    139 #pragma omp for simd lastprivate(i)
    140   for (int k = 0; k < argc; ++k)
    141     ++k;
    142   return 0;
    143 }
    144 
    145 namespace A {
    146 double x;
    147 #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
    148 }
    149 namespace B {
    150 using A::x;
    151 }
    152 
    153 int main(int argc, char **argv) {
    154   const int d = 5;       // expected-note {{constant variable is predetermined as shared}}
    155   const int da[5] = {0}; // expected-note {{constant variable is predetermined as shared}}
    156   S4 e(4);
    157   S5 g(5);
    158   S3 m;
    159   S6 n(2);
    160   int i;
    161   int &j = i;
    162 #pragma omp parallel
    163 #pragma omp for simd lastprivate // expected-error {{expected '(' after 'lastprivate'}}
    164   for (i = 0; i < argc; ++i)
    165     foo();
    166 #pragma omp parallel
    167 #pragma omp for simd lastprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
    168   for (i = 0; i < argc; ++i)
    169     foo();
    170 #pragma omp parallel
    171 #pragma omp for simd lastprivate() // expected-error {{expected expression}}
    172   for (i = 0; i < argc; ++i)
    173     foo();
    174 #pragma omp parallel
    175 #pragma omp for simd lastprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
    176   for (i = 0; i < argc; ++i)
    177     foo();
    178 #pragma omp parallel
    179 #pragma omp for simd lastprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
    180   for (i = 0; i < argc; ++i)
    181     foo();
    182 #pragma omp parallel
    183 #pragma omp for simd lastprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
    184   for (i = 0; i < argc; ++i)
    185     foo();
    186 #pragma omp parallel
    187 #pragma omp for simd lastprivate(argc)
    188   for (i = 0; i < argc; ++i)
    189     foo();
    190 #pragma omp parallel
    191 #pragma omp for simd lastprivate(S1) // expected-error {{'S1' does not refer to a value}}
    192   for (i = 0; i < argc; ++i)
    193     foo();
    194 #pragma omp parallel
    195 #pragma omp for simd lastprivate(a, b, c, d, f) // expected-error {{lastprivate variable with incomplete type 'S1'}} expected-error 3 {{shared variable cannot be lastprivate}}
    196   for (i = 0; i < argc; ++i)
    197     foo();
    198 #pragma omp parallel
    199 #pragma omp for simd lastprivate(argv[1]) // expected-error {{expected variable name}}
    200   for (i = 0; i < argc; ++i)
    201     foo();
    202 #pragma omp parallel
    203 #pragma omp for simd lastprivate(2 * 2) // expected-error {{expected variable name}}
    204   for (i = 0; i < argc; ++i)
    205     foo();
    206 #pragma omp parallel
    207 #pragma omp for simd lastprivate(ba)
    208   for (i = 0; i < argc; ++i)
    209     foo();
    210 #pragma omp parallel
    211 #pragma omp for simd lastprivate(ca) // expected-error {{shared variable cannot be lastprivate}}
    212   for (i = 0; i < argc; ++i)
    213     foo();
    214 #pragma omp parallel
    215 #pragma omp for simd lastprivate(da) // expected-error {{shared variable cannot be lastprivate}}
    216   for (i = 0; i < argc; ++i)
    217     foo();
    218   int xa;
    219 #pragma omp parallel
    220 #pragma omp for simd lastprivate(xa) // OK
    221   for (i = 0; i < argc; ++i)
    222     foo();
    223 #pragma omp parallel
    224 #pragma omp for simd lastprivate(S2::S2s) // expected-error {{shared variable cannot be lastprivate}}
    225   for (i = 0; i < argc; ++i)
    226     foo();
    227 #pragma omp parallel
    228 #pragma omp for simd lastprivate(S2::S2sc) // expected-error {{shared variable cannot be lastprivate}}
    229   for (i = 0; i < argc; ++i)
    230     foo();
    231 #pragma omp parallel
    232 #pragma omp for simd
    233   for (i = 0; i < argc; ++i)
    234     foo();
    235 #pragma omp parallel
    236 #pragma omp for simd lastprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
    237   for (i = 0; i < argc; ++i)
    238     foo();
    239 #pragma omp parallel
    240 #pragma omp for simd lastprivate(m) // expected-error {{'operator=' is a private member of 'S3'}}
    241   for (i = 0; i < argc; ++i)
    242     foo();
    243 #pragma omp parallel
    244 #pragma omp for simd lastprivate(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be lastprivate}}
    245   for (i = 0; i < argc; ++i)
    246     foo();
    247 #pragma omp parallel
    248 #pragma omp for simd private(xa), lastprivate(xa) // expected-error {{private variable cannot be lastprivate}} expected-note {{defined as private}}
    249   for (i = 0; i < argc; ++i)
    250     foo();
    251 #pragma omp parallel
    252 #pragma omp for simd lastprivate(i) // expected-note {{defined as lastprivate}}
    253   for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp for simd' directive may not be lastprivate, predetermined as linear}}
    254     foo();
    255 #pragma omp parallel private(xa) // expected-note {{defined as private}}
    256 #pragma omp for simd lastprivate(xa)  // expected-error {{lastprivate variable must be shared}}
    257   for (i = 0; i < argc; ++i)
    258     foo();
    259 #pragma omp parallel reduction(+ : xa) // expected-note {{defined as reduction}}
    260 #pragma omp for simd lastprivate(xa)        // expected-error {{lastprivate variable must be shared}}
    261   for (i = 0; i < argc; ++i)
    262     foo();
    263 #pragma omp parallel
    264 #pragma omp for simd lastprivate(j)
    265   for (i = 0; i < argc; ++i)
    266     foo();
    267 #pragma omp parallel
    268 #pragma omp for simd firstprivate(m) lastprivate(m) // expected-error {{'operator=' is a private member of 'S3'}}
    269   for (i = 0; i < argc; ++i)
    270     foo();
    271 #pragma omp parallel
    272 #pragma omp for simd lastprivate(n) firstprivate(n) // OK
    273   for (i = 0; i < argc; ++i)
    274     foo();
    275   static int si;
    276 #pragma omp for simd lastprivate(si) // OK
    277   for (i = 0; i < argc; ++i)
    278     si = i + 1;
    279   return foomain<S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<S4, S5>' requested here}}
    280 }
    281