261 lines · cpp
1// RUN: %clang_cc1 -verify -fopenmp %s -Wuninitialized2 3// RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized4 5typedef void **omp_allocator_handle_t;6extern const omp_allocator_handle_t omp_null_allocator;7extern const omp_allocator_handle_t omp_default_mem_alloc;8extern const omp_allocator_handle_t omp_large_cap_mem_alloc;9extern const omp_allocator_handle_t omp_const_mem_alloc;10extern const omp_allocator_handle_t omp_high_bw_mem_alloc;11extern const omp_allocator_handle_t omp_low_lat_mem_alloc;12extern const omp_allocator_handle_t omp_cgroup_mem_alloc;13extern const omp_allocator_handle_t omp_pteam_mem_alloc;14extern const omp_allocator_handle_t omp_thread_mem_alloc;15 16void foo() {17}18 19bool foobool(int argc) {20 return argc;21}22 23struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}24extern S1 a;25class S2 {26 mutable int a;27 28public:29 S2() : a(0) {}30};31const S2 b;32const S2 ba[5];33class S3 {34 int a;35 36public:37 S3() : a(0) {}38};39const S3 ca[5];40class S4 {41 int a;42 S4(); // expected-note {{implicitly declared private here}}43 44public:45 S4(int v) : a(v) {46#pragma omp parallel master taskloop private(a) private(this->a)47 for (int k = 0; k < v; ++k)48 ++this->a;49 }50};51class S5 {52 int a;53 S5() : a(0) {} // expected-note {{implicitly declared private here}}54 55public:56 S5(int v) : a(v) {}57 S5 &operator=(S5 &s) {58#pragma omp parallel master taskloop private(a) private(this->a) private(s.a) // expected-error {{expected variable name or data member of current class}}59 for (int k = 0; k < s.a; ++k)60 ++s.a;61 return *this;62 }63};64 65template <typename T>66class S6 {67public:68 T a;69 70 S6() : a(0) {}71 S6(T v) : a(v) {72#pragma omp parallel master taskloop private(a) private(this->a) allocate(omp_thread_mem_alloc: a) // expected-warning {{allocator with the 'thread' trait access has unspecified behavior on 'parallel master taskloop' directive}}73 for (int k = 0; k < v; ++k)74 ++this->a;75 }76 S6 &operator=(S6 &s) {77#pragma omp parallel master taskloop private(a) private(this->a) private(s.a) // expected-error {{expected variable name or data member of current class}}78 for (int k = 0; k < s.a; ++k)79 ++s.a;80 return *this;81 }82};83 84template <typename T>85class S7 : public T {86 T a;87 S7() : a(0) {}88 89public:90 S7(T v) : a(v) {91#pragma omp parallel master taskloop private(a) private(this->a) private(T::a)92 for (int k = 0; k < a.a; ++k)93 ++this->a.a;94 }95 S7 &operator=(S7 &s) {96#pragma omp parallel master taskloop private(a) private(this->a) private(s.a) private(s.T::a) // expected-error 2 {{expected variable name or data member of current class}}97 for (int k = 0; k < s.a.a; ++k)98 ++s.a.a;99 return *this;100 }101};102 103S3 h;104#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}105 106template <class I, class C>107int foomain(I argc, C **argv) {108 I e(4);109 I g(5);110 int i, z;111 int &j = i;112#pragma omp parallel master taskloop private // expected-error {{expected '(' after 'private'}}113 for (int k = 0; k < argc; ++k)114 ++k;115#pragma omp parallel master taskloop private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}116 for (int k = 0; k < argc; ++k)117 ++k;118#pragma omp parallel master taskloop private() // expected-error {{expected expression}}119 for (int k = 0; k < argc; ++k)120 ++k;121#pragma omp parallel master taskloop private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}122 for (int k = 0; k < argc; ++k)123 ++k;124#pragma omp parallel master taskloop private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}125 for (int k = 0; k < argc; ++k)126 ++k;127#pragma omp parallel master taskloop private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}128 for (int k = 0; k < argc; ++k)129 ++k;130#pragma omp parallel master taskloop private(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 '('}}131 for (int k = 0; k < argc; ++k)132 ++k;133#pragma omp parallel master taskloop private(S1) // expected-error {{'S1' does not refer to a value}}134 for (int k = 0; k < argc; ++k)135 ++k;136#pragma omp parallel master taskloop private(a, b) // expected-error {{private variable with incomplete type 'S1'}}137 for (int k = 0; k < argc; ++k)138 ++k;139#pragma omp parallel master taskloop private(argv[1]) // expected-error {{expected variable name}}140 for (int k = 0; k < argc; ++k)141 ++k;142#pragma omp parallel master taskloop private(e, g, z)143 for (int k = 0; k < argc; ++k)144 ++k;145#pragma omp parallel master taskloop private(h) // expected-error {{threadprivate or thread local variable cannot be private}}146 for (int k = 0; k < argc; ++k)147 ++k;148#pragma omp parallel master taskloop shared(i)149 for (int k = 0; k < argc; ++k)150 ++k;151#pragma omp parallel152 {153 int v = 0;154 int i;155#pragma omp parallel master taskloop private(i)156 for (int k = 0; k < argc; ++k) {157 i = k;158 v += i;159 }160 }161#pragma omp parallel shared(i)162#pragma omp parallel private(i)163#pragma omp parallel master taskloop private(j)164 for (int k = 0; k < argc; ++k)165 ++k;166#pragma omp parallel master taskloop private(i)167 for (int k = 0; k < argc; ++k)168 ++k;169 return 0;170}171 172void bar(S4 a[2]) {173#pragma omp parallel174#pragma omp parallel master taskloop private(a)175 for (int i = 0; i < 2; ++i)176 foo();177}178 179namespace A {180double x;181#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}182}183namespace B {184using A::x;185}186 187int main(int argc, char **argv) {188 S4 e(4);189 S5 g(5);190 S6<float> s6(0.0) , s6_0(1.0); // expected-note {{in instantiation of member function 'S6<float>::S6' requested here}}191 S7<S6<float> > s7(0.0) , s7_0(1.0);192 int i, z;193 int &j = i;194#pragma omp parallel master taskloop private // expected-error {{expected '(' after 'private'}}195 for (int k = 0; k < argc; ++k)196 ++k;197#pragma omp parallel master taskloop private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}198 for (int k = 0; k < argc; ++k)199 ++k;200#pragma omp parallel master taskloop private() // expected-error {{expected expression}}201 for (int k = 0; k < argc; ++k)202 ++k;203#pragma omp parallel master taskloop private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}204 for (int k = 0; k < argc; ++k)205 ++k;206#pragma omp parallel master taskloop private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}207 for (int k = 0; k < argc; ++k)208 ++k;209#pragma omp parallel master taskloop private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}210 for (int k = 0; k < argc; ++k)211 ++k;212#pragma omp parallel master taskloop private(argc)213 for (int k = 0; k < argc; ++k)214 ++k;215#pragma omp parallel master taskloop private(S1) // expected-error {{'S1' does not refer to a value}}216 for (int k = 0; k < argc; ++k)217 ++k;218#pragma omp parallel master taskloop private(a, b) // expected-error {{private variable with incomplete type 'S1'}}219 for (int k = 0; k < argc; ++k)220 ++k;221#pragma omp parallel master taskloop private(argv[1]) // expected-error {{expected variable name}}222 for (int k = 0; k < argc; ++k)223 ++k;224#pragma omp parallel master taskloop private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}225 for (int k = 0; k < argc; ++k)226 ++k;227#pragma omp parallel master taskloop private(h) // expected-error {{threadprivate or thread local variable cannot be private}}228 for (int k = 0; k < argc; ++k)229 ++k;230#pragma omp parallel master taskloop private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}}231 for (int k = 0; k < argc; ++k)232 ++k;233#pragma omp parallel master taskloop shared(i)234 for (int k = 0; k < argc; ++k)235 ++k;236#pragma omp parallel237 {238 int i;239#pragma omp parallel master taskloop private(i)240 for (int k = 0; k < argc; ++k)241 ++k;242 }243#pragma omp parallel shared(i)244#pragma omp parallel private(i)245#pragma omp parallel master taskloop private(j)246 for (int k = 0; k < argc; ++k)247 ++k;248#pragma omp parallel master taskloop private(i, z)249 for (int k = 0; k < argc; ++k)250 ++k;251 static int si;252#pragma omp parallel master taskloop private(si) // OK253 for(int k = 0; k < argc; ++k)254 si = k + 1;255 256 s6 = s6_0; // expected-note {{in instantiation of member function 'S6<float>::operator=' requested here}}257 s7 = s7_0; // expected-note {{in instantiation of member function 'S7<S6<float>>::operator=' requested here}}258 return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char>' requested here}}259}260 261