Home | History | Annotate | Download | only in OpenMP
      1 // RUN: %clang_cc1 -verify -fopenmp=libiomp5 %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 };
     18 const S2 b;
     19 const S2 ba[5];
     20 class S3 {
     21   int a;
     22 
     23 public:
     24   S3() : a(0) {}
     25 };
     26 const S3 ca[5];
     27 class S4 {
     28   int a;
     29   S4(); // expected-note {{implicitly declared private here}}
     30 
     31 public:
     32   S4(int v) : a(v) {}
     33 };
     34 class S5 {
     35   int a;
     36   S5() : a(0) {} // expected-note {{implicitly declared private here}}
     37 
     38 public:
     39   S5(int v) : a(v) {}
     40 };
     41 
     42 S3 h;
     43 #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
     44 
     45 template <class I, class C>
     46 int foomain(I argc, C **argv) {
     47   I e(4);
     48   I g(5);
     49   int i;
     50   int &j = i;                // expected-note {{'j' defined here}}
     51 #pragma omp single private // expected-error {{expected '(' after 'private'}}
     52   foo();
     53 #pragma omp single private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
     54   foo();
     55 #pragma omp single private() // expected-error {{expected expression}}
     56   foo();
     57 #pragma omp single private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
     58   foo();
     59 #pragma omp single private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
     60   foo();
     61 #pragma omp single private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
     62   foo();
     63 #pragma omp single private(argc)
     64   foo();
     65 #pragma omp single private(S1) // expected-error {{'S1' does not refer to a value}}
     66   foo();
     67 #pragma omp single private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
     68   foo();
     69 #pragma omp single private(argv[1]) // expected-error {{expected variable name}}
     70   foo();
     71 #pragma omp single private(e, g)
     72   foo();
     73 #pragma omp single private(h) // expected-error {{threadprivate or thread local variable cannot be private}}
     74   foo();
     75 #pragma omp single shared(i) // expected-error {{unexpected OpenMP clause 'shared' in directive '#pragma omp single'}}
     76   foo();
     77 #pragma omp parallel
     78   {
     79     int v = 0;
     80     int i;
     81 #pragma omp single private(i)
     82     foo();
     83     v += i;
     84   }
     85 #pragma omp parallel shared(i)
     86 #pragma omp parallel private(i)
     87 #pragma omp single private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}}
     88   foo();
     89 #pragma omp single private(i)
     90   foo();
     91   return 0;
     92 }
     93 
     94 namespace A {
     95 double x;
     96 #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
     97 }
     98 namespace B {
     99 using A::x;
    100 }
    101 
    102 int main(int argc, char **argv) {
    103   S4 e(4);
    104   S5 g(5);
    105   int i;
    106   int &j = i;                // expected-note {{'j' defined here}}
    107 #pragma omp single private // expected-error {{expected '(' after 'private'}}
    108   foo();
    109 #pragma omp single private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
    110   foo();
    111 #pragma omp single private() // expected-error {{expected expression}}
    112   foo();
    113 #pragma omp single private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}
    114   foo();
    115 #pragma omp single private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
    116   foo();
    117 #pragma omp single private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}
    118   foo();
    119 #pragma omp single private(argc)
    120   foo();
    121 #pragma omp single private(S1) // expected-error {{'S1' does not refer to a value}}
    122   foo();
    123 #pragma omp single private(a, b) // expected-error {{private variable with incomplete type 'S1'}}
    124   foo();
    125 #pragma omp single private(argv[1]) // expected-error {{expected variable name}}
    126   foo();
    127 #pragma omp single private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}
    128   foo();
    129 #pragma omp single private(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}}
    130   foo();
    131 #pragma omp single shared(i) // expected-error {{unexpected OpenMP clause 'shared' in directive '#pragma omp single'}}
    132   foo();
    133 #pragma omp parallel
    134   {
    135     int i;
    136 #pragma omp single private(i)
    137     foo();
    138   }
    139 #pragma omp parallel shared(i)
    140 #pragma omp parallel private(i)
    141 #pragma omp single private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}}
    142   foo();
    143 #pragma omp single private(i)
    144   foo();
    145 
    146   return 0;
    147 }
    148 
    149