345 lines · cpp
1// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 %s -Wuninitialized2// RUN: %clang_cc1 -verify -fopenmp %s -Wuninitialized3 4// RUN: %clang_cc1 -verify -fopenmp-simd -fopenmp-version=45 %s -Wuninitialized5// RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized6 7void foo() {8}9 10bool foobool(int argc) {11 return argc;12}13extern int omp_default_mem_alloc;14struct S1; // expected-note 2 {{declared here}} expected-note 3 {{forward declaration of 'S1'}}15extern S1 a;16class S2 {17 mutable int a;18 19public:20 S2() : a(0) {}21 S2(S2 &s2) : a(s2.a) {}22 const S2 &operator =(const S2&) const;23 S2 &operator =(const S2&);24 static float S2s; // expected-note {{static data member is predetermined as shared}}25 static const float S2sc; // expected-note {{'S2sc' declared here}}26};27const float S2::S2sc = 0;28const S2 b;29const S2 ba[5];30class S3 {31 int a;32 S3 &operator=(const S3 &s3); // expected-note {{implicitly declared private here}}33 34public:35 S3() : a(0) {}36 S3(S3 &s3) : a(s3.a) {}37};38const S3 c; // expected-note {{'c' defined here}}39const S3 ca[5]; // expected-note {{'ca' defined here}}40extern const int f; // expected-note {{'f' declared here}}41class S4 {42 int a;43 S4(); // expected-note 3 {{implicitly declared private here}}44 S4(const S4 &s4);45 46public:47 S4(int v) : a(v) {}48};49class S5 {50 int a;51 S5() : a(0) {} // expected-note {{implicitly declared private here}}52 53public:54 S5(const S5 &s5) : a(s5.a) {}55 S5(int v) : a(v) {}56};57class S6 {58 int a;59 S6() : a(0) {} // expected-note {{implicitly declared private here}}60 61public:62 S6(const S6 &s6) : a(s6.a) {}63 S6(int v) : a(v) {}64};65 66S3 h;67#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}68 69template <class I, class C>70int foomain(int argc, char **argv) {71 I e(4);72 I g(5);73 int i;74 int &j = i;75#pragma omp target76#pragma omp teams77#pragma omp distribute parallel for lastprivate // expected-error {{expected '(' after 'lastprivate'}}78 for (int k = 0; k < argc; ++k)79 ++k;80#pragma omp target81#pragma omp teams82#pragma omp distribute parallel for lastprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}83 for (int k = 0; k < argc; ++k)84 ++k;85#pragma omp target86#pragma omp teams87#pragma omp distribute parallel for lastprivate() // expected-error {{expected expression}}88 for (int k = 0; k < argc; ++k)89 ++k;90#pragma omp target91#pragma omp teams92#pragma omp distribute parallel for lastprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}93 for (int k = 0; k < argc; ++k)94 ++k;95#pragma omp target96#pragma omp teams97#pragma omp distribute parallel for lastprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}98 for (int k = 0; k < argc; ++k)99 ++k;100#pragma omp target101#pragma omp teams102#pragma omp distribute parallel for lastprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}103 for (int k = 0; k < argc; ++k)104 ++k;105#pragma omp target106#pragma omp teams107#pragma omp distribute parallel for lastprivate(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 '('}}108 for (int k = 0; k < argc; ++k)109 ++k;110#pragma omp target111#pragma omp teams112#pragma omp distribute parallel for lastprivate(conditional: argc) lastprivate(conditional: // expected-error 2 {{use of undeclared identifier 'conditional'}} expected-error {{expected ')'}} expected-note {{to match this '('}}113 for (int k = 0; k < argc; ++k)114 ++k;115#pragma omp target116#pragma omp teams117#pragma omp distribute parallel for lastprivate(S1) // expected-error {{'S1' does not refer to a value}}118 for (int k = 0; k < argc; ++k)119 ++k;120#pragma omp target121#pragma omp teams122#pragma omp distribute parallel for lastprivate(a, b) // expected-error {{lastprivate variable with incomplete type 'S1'}} expected-warning {{type 'const S2' is not trivially copyable and not guaranteed to be mapped correctly}}123 for (int k = 0; k < argc; ++k)124 ++k;125#pragma omp target126#pragma omp teams127#pragma omp distribute parallel for lastprivate(argv[1]) // expected-error {{expected variable name}}128 for (int k = 0; k < argc; ++k)129 ++k;130#pragma omp target131#pragma omp teams132#pragma omp distribute parallel for lastprivate(e, g) // expected-error 2 {{calling a private constructor of class 'S4'}} expected-warning 2 {{type 'S4' is not trivially copyable and not guaranteed to be mapped correctly}}133 for (int k = 0; k < argc; ++k)134 ++k;135#pragma omp target136#pragma omp teams137#pragma omp distribute parallel for lastprivate(h) // expected-error {{threadprivate or thread local variable cannot be lastprivate}}138 for (int k = 0; k < argc; ++k)139 ++k;140 141 int v = 0;142#pragma omp target143#pragma omp teams144 {145#pragma omp distribute parallel for lastprivate(i)146 for (int k = 0; k < argc; ++k) {147 i = k;148 v += i;149 }150 }151#pragma omp target152#pragma omp teams private(i)153#pragma omp distribute parallel for lastprivate(j)154 for (int k = 0; k < argc; ++k)155 ++k;156#pragma omp target157#pragma omp teams158#pragma omp distribute parallel for lastprivate(i)159 for (int k = 0; k < argc; ++k)160 ++k;161 return 0;162}163 164void bar(S4 a[2]) {165#pragma omp target166#pragma omp teams167#pragma omp distribute parallel for lastprivate(a)168 for (int i = 0; i < 2; ++i)169 foo();170}171 172namespace A {173double x;174#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}175}176namespace B {177using A::x;178}179 180int main(int argc, char **argv) {181 const int d = 5; // expected-note {{'d' defined here}}182 const int da[5] = {0}; // expected-note {{'da' defined here}}183 S4 e(4);184 S5 g(5);185 S3 m;186 S6 n(2);187 int i;188 int &j = i;189#pragma omp target190#pragma omp teams191#pragma omp distribute parallel for lastprivate // expected-error {{expected '(' after 'lastprivate'}}192 for (i = 0; i < argc; ++i)193 foo();194#pragma omp target195#pragma omp teams196#pragma omp distribute parallel for lastprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}197 for (i = 0; i < argc; ++i)198 foo();199#pragma omp target200#pragma omp teams201#pragma omp distribute parallel for lastprivate() // expected-error {{expected expression}}202 for (i = 0; i < argc; ++i)203 foo();204#pragma omp target205#pragma omp teams206#pragma omp distribute parallel for lastprivate(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}207 for (i = 0; i < argc; ++i)208 foo();209#pragma omp target210#pragma omp teams211#pragma omp distribute parallel for lastprivate(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}212 for (i = 0; i < argc; ++i)213 foo();214#pragma omp target215#pragma omp teams216#pragma omp distribute parallel for lastprivate(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}217 for (i = 0; i < argc; ++i)218 foo();219#pragma omp target220#pragma omp teams221#pragma omp distribute parallel for lastprivate(argc)222 for (i = 0; i < argc; ++i)223 foo();224#pragma omp target225#pragma omp teams226#pragma omp distribute parallel for lastprivate(S1) // expected-error {{'S1' does not refer to a value}}227 for (i = 0; i < argc; ++i)228 foo();229#pragma omp target230#pragma omp teams231#pragma omp distribute parallel for lastprivate(a, b, c, d, f) // expected-error {{lastprivate variable with incomplete type 'S1'}} expected-error 1 {{const-qualified variable without mutable fields cannot be lastprivate}} expected-error 2 {{const-qualified variable cannot be lastprivate}} expected-error {{incomplete type 'S1' where a complete type is required}} expected-warning {{type 'const S2' is not trivially copyable and not guaranteed to be mapped correctly}} expected-warning {{type 'const S3' is not trivially copyable and not guaranteed to be mapped correctly}}232 for (i = 0; i < argc; ++i)233 foo();234#pragma omp target235#pragma omp teams236#pragma omp distribute parallel for lastprivate(argv[1]) // expected-error {{expected variable name}}237 for (i = 0; i < argc; ++i)238 foo();239#pragma omp target240#pragma omp teams241#pragma omp distribute parallel for lastprivate(2 * 2) // expected-error {{expected variable name}}242 for (i = 0; i < argc; ++i)243 foo();244#pragma omp target245#pragma omp teams246#pragma omp distribute parallel for lastprivate(ba) // expected-warning {{type 'const S2[5]' is not trivially copyable and not guaranteed to be mapped correctly}}247 for (i = 0; i < argc; ++i)248 foo();249#pragma omp target250#pragma omp teams251#pragma omp distribute parallel for lastprivate(ca) // expected-error {{const-qualified variable without mutable fields cannot be lastprivate}} expected-warning {{type 'const S3[5]' is not trivially copyable and not guaranteed to be mapped correctly}}252 for (i = 0; i < argc; ++i)253 foo();254#pragma omp target255#pragma omp teams256#pragma omp distribute parallel for lastprivate(da) // expected-error {{const-qualified variable cannot be lastprivate}}257 for (i = 0; i < argc; ++i)258 foo();259 int xa;260#pragma omp target261#pragma omp teams262#pragma omp distribute parallel for lastprivate(xa) // OK263 for (i = 0; i < argc; ++i)264 foo();265#pragma omp target266#pragma omp teams267#pragma omp distribute parallel for lastprivate(S2::S2s) // expected-error {{shared variable cannot be lastprivate}}268 for (i = 0; i < argc; ++i)269 foo();270#pragma omp target271#pragma omp teams272#pragma omp distribute parallel for lastprivate(S2::S2sc) // expected-error {{const-qualified variable cannot be lastprivate}}273 for (i = 0; i < argc; ++i)274 foo();275#pragma omp target276#pragma omp teams277#pragma omp distribute parallel for safelen(5) // expected-error {{unexpected OpenMP clause 'safelen' in directive '#pragma omp distribute parallel for'}}278 for (i = 0; i < argc; ++i)279 foo();280#pragma omp target281#pragma omp teams282#pragma omp distribute parallel for lastprivate(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} expected-warning {{type 'S4' is not trivially copyable and not guaranteed to be mapped correctly}} expected-warning {{type 'S5' is not trivially copyable and not guaranteed to be mapped correctly}}283 for (i = 0; i < argc; ++i)284 foo();285#pragma omp target286#pragma omp teams287#pragma omp distribute parallel for lastprivate(m) // expected-error {{'operator=' is a private member of 'S3'}} expected-warning {{type 'S3' is not trivially copyable and not guaranteed to be mapped correctly}}288 for (i = 0; i < argc; ++i)289 foo();290#pragma omp target291#pragma omp teams292#pragma omp distribute parallel for lastprivate(h) // expected-error {{threadprivate or thread local variable cannot be lastprivate}}293 for (i = 0; i < argc; ++i)294 foo();295#pragma omp target296#pragma omp teams297#pragma omp distribute parallel for lastprivate(B::x) // expected-error {{threadprivate or thread local variable cannot be lastprivate}}298 for (i = 0; i < argc; ++i)299 foo();300#pragma omp target301#pragma omp teams302#pragma omp distribute parallel for private(xa), lastprivate(xa) // expected-error {{private variable cannot be lastprivate}} expected-note {{defined as private}}303 for (i = 0; i < argc; ++i)304 foo();305#pragma omp target306#pragma omp teams307#pragma omp distribute parallel for lastprivate(i)308 for (i = 0; i < argc; ++i)309 foo();310#pragma omp target311#pragma omp teams312#pragma omp distribute parallel for lastprivate(xa)313 for (i = 0; i < argc; ++i)314 foo();315#pragma omp target316#pragma omp teams317#pragma omp distribute parallel for lastprivate(xa)318 for (i = 0; i < argc; ++i)319 foo();320#pragma omp target321#pragma omp teams322#pragma omp distribute parallel for lastprivate(j)323 for (i = 0; i < argc; ++i)324 foo();325// expected-error@+3 {{firstprivate variable cannot be lastprivate}} expected-note@+3 {{defined as firstprivate}}326#pragma omp target327#pragma omp teams328#pragma omp distribute parallel for firstprivate(m) lastprivate(m) // expected-warning {{type 'S3' is not trivially copyable and not guaranteed to be mapped correctly}}329 for (i = 0; i < argc; ++i)330 foo();331// expected-error@+3 {{lastprivate variable cannot be firstprivate}} expected-note@+3 {{defined as lastprivate}}332#pragma omp target333#pragma omp teams334#pragma omp distribute parallel for lastprivate(n) firstprivate(n) // expected-error {{calling a private constructor of class 'S6'}} expected-warning {{type 'S6' is not trivially copyable and not guaranteed to be mapped correctly}}335 for (i = 0; i < argc; ++i)336 foo();337 static int si;338#pragma omp target339#pragma omp teams340#pragma omp distribute parallel for lastprivate(si) // OK341 for (i = 0; i < argc; ++i)342 si = i + 1;343 return foomain<S4, S5>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<S4, S5>' requested here}}344}345