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 sections private // expected-error {{expected '(' after 'private'}} 52 { 53 foo(); 54 } 55 #pragma omp sections private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 56 { 57 foo(); 58 } 59 #pragma omp sections private() // expected-error {{expected expression}} 60 { 61 foo(); 62 } 63 #pragma omp sections private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} 64 { 65 foo(); 66 } 67 #pragma omp sections private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 68 { 69 foo(); 70 } 71 #pragma omp sections private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 72 { 73 foo(); 74 } 75 #pragma omp sections private(argc) 76 { 77 foo(); 78 } 79 #pragma omp sections private(S1) // expected-error {{'S1' does not refer to a value}} 80 { 81 foo(); 82 } 83 #pragma omp sections private(a, b) // expected-error {{private variable with incomplete type 'S1'}} 84 { 85 foo(); 86 } 87 #pragma omp sections private(argv[1]) // expected-error {{expected variable name}} 88 { 89 foo(); 90 } 91 #pragma omp sections private(e, g) 92 { 93 foo(); 94 } 95 #pragma omp sections private(h) // expected-error {{threadprivate or thread local variable cannot be private}} 96 { 97 foo(); 98 } 99 #pragma omp sections shared(i) // expected-error {{unexpected OpenMP clause 'shared' in directive '#pragma omp sections'}} 100 { 101 foo(); 102 } 103 #pragma omp parallel 104 { 105 int v = 0; 106 int i; 107 #pragma omp sections private(i) 108 { 109 foo(); 110 } 111 v += i; 112 } 113 #pragma omp parallel shared(i) 114 #pragma omp parallel private(i) 115 #pragma omp sections private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} 116 { 117 foo(); 118 } 119 #pragma omp sections private(i) 120 { 121 foo(); 122 } 123 return 0; 124 } 125 126 namespace A { 127 double x; 128 #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}} 129 } 130 namespace B { 131 using A::x; 132 } 133 134 int main(int argc, char **argv) { 135 S4 e(4); 136 S5 g(5); 137 int i; 138 int &j = i; // expected-note {{'j' defined here}} 139 #pragma omp sections private // expected-error {{expected '(' after 'private'}} 140 { 141 foo(); 142 } 143 #pragma omp sections private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 144 { 145 foo(); 146 } 147 #pragma omp sections private() // expected-error {{expected expression}} 148 { 149 foo(); 150 } 151 #pragma omp sections private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}} 152 { 153 foo(); 154 } 155 #pragma omp sections private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} 156 { 157 foo(); 158 } 159 #pragma omp sections private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}} 160 { 161 foo(); 162 } 163 #pragma omp sections private(argc) 164 { 165 foo(); 166 } 167 #pragma omp sections private(S1) // expected-error {{'S1' does not refer to a value}} 168 { 169 foo(); 170 } 171 #pragma omp sections private(a, b) // expected-error {{private variable with incomplete type 'S1'}} 172 { 173 foo(); 174 } 175 #pragma omp sections private(argv[1]) // expected-error {{expected variable name}} 176 { 177 foo(); 178 } 179 #pragma omp sections private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} 180 { 181 foo(); 182 } 183 #pragma omp sections private(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}} 184 { 185 foo(); 186 } 187 #pragma omp sections shared(i) // expected-error {{unexpected OpenMP clause 'shared' in directive '#pragma omp sections'}} 188 { 189 foo(); 190 } 191 #pragma omp parallel 192 { 193 int i; 194 #pragma omp sections private(i) 195 { 196 foo(); 197 } 198 } 199 #pragma omp parallel shared(i) 200 #pragma omp parallel private(i) 201 #pragma omp sections private(j) // expected-error {{arguments of OpenMP clause 'private' cannot be of reference type}} 202 { 203 foo(); 204 } 205 #pragma omp sections private(i) 206 { 207 foo(); 208 } 209 210 return 0; 211 } 212 213