352 lines · cpp
1// RUN: %clang_cc1 -verify -fopenmp %s -Wuninitialized2 3// RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized4 5extern int omp_default_mem_alloc;6void foo() {7}8 9bool foobool(int argc) {10 return argc;11}12 13struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}14extern S1 a;15class S2 {16 mutable int a;17 18public:19 S2() : a(0) {}20 S2(const S2 &s2) : a(s2.a) {}21 static float S2s;22 static const float S2sc;23};24const float S2::S2sc = 0;25const S2 b;26const S2 ba[5];27class S3 {28 int a;29 S3 &operator=(const S3 &s3);30 31public:32 S3() : a(0) {}33 S3(const S3 &s3) : a(s3.a) {}34};35const S3 c;36const S3 ca[5];37extern const int f;38class S4 {39 int a;40 S4();41 S4(const S4 &s4); // expected-note 2 {{implicitly declared private here}}42 43public:44 S4(int v) : a(v) {}45};46class S5 {47 int a;48 S5(const S5 &s5) : a(s5.a) {} // expected-note 4 {{implicitly declared private here}}49 50public:51 S5() : a(0) {}52 S5(int v) : a(v) {}53};54class S6 {55 int a;56 S6() : a(0) {}57 58public:59 S6(const S6 &s6) : a(s6.a) {}60 S6(int v) : a(v) {}61};62 63S3 h;64#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}65 66template <class I, class C>67int foomain(int argc, char **argv) {68 I e(4);69 C g(5);70 int i, z;71 int &j = i;72#pragma omp parallel73#pragma omp sections firstprivate // expected-error {{expected '(' after 'firstprivate'}}74 {75 foo();76 }77#pragma omp parallel78#pragma omp sections firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}79 {80 foo();81 }82#pragma omp parallel83#pragma omp sections firstprivate() // expected-error {{expected expression}}84 {85 foo();86 }87#pragma omp parallel88#pragma omp sections firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}89 {90 foo();91 }92#pragma omp parallel93#pragma omp sections firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}94 {95 foo();96 }97#pragma omp parallel98#pragma omp sections firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}99 {100 foo();101 }102#pragma omp parallel103#pragma omp sections firstprivate(argc) allocate , allocate(, allocate(omp_default , allocate(omp_default_mem_alloc, allocate(omp_default_mem_alloc:, allocate(omp_default_mem_alloc: argc, allocate(omp_default_mem_alloc: argv), allocate(argv) // expected-error {{expected '(' after 'allocate'}} expected-error 2 {{expected expression}} expected-error 2 {{expected ')'}} expected-error {{use of undeclared identifier 'omp_default'}} expected-note 2 {{to match this '('}}104 {105 foo();106 }107#pragma omp parallel108#pragma omp sections firstprivate(S1) // expected-error {{'S1' does not refer to a value}}109 {110 foo();111 }112#pragma omp parallel113#pragma omp sections firstprivate(z, a, b) // expected-error {{firstprivate variable with incomplete type 'S1'}}114 {115 foo();116 }117#pragma omp parallel118#pragma omp sections firstprivate(argv[1]) // expected-error {{expected variable name}}119 {120 foo();121 }122#pragma omp parallel123#pragma omp sections firstprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}124 {125 foo();126 }127#pragma omp parallel128#pragma omp sections firstprivate(h) // expected-error {{threadprivate or thread local variable cannot be firstprivate}}129 {130 foo();131 }132#pragma omp parallel133#pragma omp sections linear(i) // expected-error {{unexpected OpenMP clause 'linear' in directive '#pragma omp sections'}}134 {135 foo();136 }137#pragma omp parallel138 {139 int v = 0;140 int i; // expected-note {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp sections' directive into a parallel or another task region?}}141#pragma omp sections firstprivate(i) // expected-error {{firstprivate variable must be shared}}142 {143 foo();144 }145 v += i;146 }147#pragma omp parallel shared(i)148#pragma omp parallel private(i)149#pragma omp sections firstprivate(j)150 {151 foo();152 }153#pragma omp parallel154#pragma omp sections firstprivate(i)155 {156 foo();157 }158#pragma omp parallel159#pragma omp sections lastprivate(g) firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}}160 {161 foo();162 }163#pragma omp parallel private(i) // expected-note {{defined as private}}164#pragma omp sections firstprivate(i) // expected-error {{firstprivate variable must be shared}}165 {166 foo();167 }168#pragma omp parallel reduction(+ : i) // expected-note {{defined as reduction}}169#pragma omp sections firstprivate(i) // expected-error {{firstprivate variable must be shared}}170 {171 foo();172 }173 return 0;174}175 176namespace A {177double x;178#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}179}180namespace B {181using A::x;182}183 184int main(int argc, char **argv) {185 const int d = 5;186 const int da[5] = {0};187 S4 e(4);188 S5 g(5);189 S3 m;190 S6 n(2);191 int i, z;192 int &j = i;193#pragma omp parallel194#pragma omp sections firstprivate // expected-error {{expected '(' after 'firstprivate'}}195 {196 foo();197 }198#pragma omp parallel199#pragma omp sections firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}200 {201 foo();202 }203#pragma omp parallel204#pragma omp sections firstprivate() // expected-error {{expected expression}}205 {206 foo();207 }208#pragma omp parallel209#pragma omp sections firstprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}210 {211 foo();212 }213#pragma omp parallel214#pragma omp sections firstprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}215 {216 foo();217 }218#pragma omp parallel219#pragma omp sections firstprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}220 {221 foo();222 }223#pragma omp parallel224#pragma omp sections firstprivate(argc, z)225 {226 foo();227 }228#pragma omp parallel229#pragma omp sections firstprivate(S1) // expected-error {{'S1' does not refer to a value}}230 {231 foo();232 }233#pragma omp parallel234#pragma omp sections firstprivate(a, b, c, d, f) // expected-error {{firstprivate variable with incomplete type 'S1'}}235 {236 foo();237 }238#pragma omp parallel239#pragma omp sections firstprivate(argv[1]) // expected-error {{expected variable name}}240 {241 foo();242 }243#pragma omp parallel244#pragma omp sections firstprivate(2 * 2) // expected-error {{expected variable name}}245 {246 foo();247 }248#pragma omp parallel249#pragma omp sections firstprivate(ba) // OK250 {251 foo();252 }253#pragma omp parallel254#pragma omp sections firstprivate(ca) // OK255 {256 foo();257 }258#pragma omp parallel259#pragma omp sections firstprivate(da) // OK260 {261 foo();262 }263 int xa;264#pragma omp parallel265#pragma omp sections firstprivate(xa) // OK266 {267 foo();268 }269#pragma omp parallel270#pragma omp sections firstprivate(S2::S2s) // OK271 {272 foo();273 }274#pragma omp parallel275#pragma omp sections firstprivate(S2::S2sc) // OK276 {277 foo();278 }279#pragma omp parallel280#pragma omp sections safelen(5) // expected-error {{unexpected OpenMP clause 'safelen' in directive '#pragma omp sections'}}281 {282 foo();283 }284#pragma omp parallel285#pragma omp sections firstprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}286 {287 foo();288 }289#pragma omp parallel290#pragma omp sections firstprivate(m) // OK291 {292 foo();293 }294#pragma omp parallel295#pragma omp sections firstprivate(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be firstprivate}}296 {297 foo();298 }299#pragma omp parallel300#pragma omp sections private(xa), firstprivate(xa) // expected-error {{private variable cannot be firstprivate}} expected-note {{defined as private}}301 {302 foo();303 }304#pragma omp parallel shared(xa)305#pragma omp sections firstprivate(xa) // OK: may be firstprivate306 {307 foo();308 }309#pragma omp parallel310#pragma omp sections firstprivate(j)311 {312 foo();313 }314#pragma omp parallel315#pragma omp sections lastprivate(g) firstprivate(g) // expected-error {{calling a private constructor of class 'S5'}}316 {317 foo();318 }319#pragma omp parallel320#pragma omp sections lastprivate(n) firstprivate(n) // OK321 {322 foo();323 }324#pragma omp parallel325 {326 int v = 0;327 int i; // expected-note {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp sections' directive into a parallel or another task region?}}328#pragma omp sections firstprivate(i) // expected-error {{firstprivate variable must be shared}}329 {330 foo();331 }332 v += i;333 }334#pragma omp parallel private(i) // expected-note {{defined as private}}335#pragma omp sections firstprivate(i) // expected-error {{firstprivate variable must be shared}}336 {337 foo();338 }339#pragma omp parallel reduction(+ : i) // expected-note {{defined as reduction}}340#pragma omp sections firstprivate(i) // expected-error {{firstprivate variable must be shared}}341 {342 foo();343 }344 static int r;345#pragma omp sections firstprivate(r) // OK346 {347 foo();348 }349 350 return foomain<S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<S4, S5>' requested here}}351}352