245 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 target parallel for simd 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 target parallel for simd 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) // expected-warning {{type 'S5' is not trivially copyable and not guaranteed to be mapped correctly}}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 target parallel for simd allocate(omp_thread_mem_alloc: a) private(a) private(this->a) uses_allocators(omp_thread_mem_alloc) // expected-warning {{allocator with the 'thread' trait access has unspecified behavior on 'target parallel for simd' directive}}73 for (int k = 0; k < v; ++k)74 ++this->a;75 }76 S6 &operator=(S6 &s) {77#pragma omp target parallel for simd 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 target parallel for simd 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 target parallel for simd 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 target parallel for simd private // expected-error {{expected '(' after 'private'}}113 for (int k = 0; k < argc; ++k)114 ++k;115#pragma omp target parallel for simd 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 target parallel for simd private() // expected-error {{expected expression}}119 for (int k = 0; k < argc; ++k)120 ++k;121#pragma omp target parallel for simd private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}122 for (int k = 0; k < argc; ++k)123 ++k;124#pragma omp target parallel for simd 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 target parallel for simd 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 target parallel for simd 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 target parallel for simd private(S1) // expected-error {{'S1' does not refer to a value}}134 for (int k = 0; k < argc; ++k)135 ++k;136#pragma omp target parallel for simd private(a, b) // expected-error {{private variable with incomplete type 'S1'}}137 for (int k = 0; k < argc; ++k)138 ++k;139#pragma omp target parallel for simd private(argv[1]) // expected-error {{expected variable name}}140 for (int k = 0; k < argc; ++k)141 ++k;142#pragma omp target parallel for simd private(e, g, z)143 for (int k = 0; k < argc; ++k)144 ++k;145#pragma omp target parallel for simd 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 parallel149 {150 int v = 0;151 int i;152#pragma omp target parallel for simd private(i)153 for (int k = 0; k < argc; ++k) {154 i = k;155 v += i;156 }157 }158#pragma omp parallel shared(i)159#pragma omp parallel private(i)160#pragma omp target parallel for simd private(j)161 for (int k = 0; k < argc; ++k)162 ++k;163#pragma omp target parallel for simd private(i)164 for (int k = 0; k < argc; ++k)165 ++k;166 return 0;167}168 169namespace A {170double x;171#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}172}173namespace B {174using A::x;175}176 177int main(int argc, char **argv) {178 S4 e(4);179 S5 g(5);180 S6<float> s6(0.0) , s6_0(1.0); // expected-note {{in instantiation of member function 'S6<float>::S6' requested here}}181 S7<S6<float> > s7(0.0) , s7_0(1.0);182 int i, z;183 int &j = i;184#pragma omp target parallel for simd private // expected-error {{expected '(' after 'private'}}185 for (int k = 0; k < argc; ++k)186 ++k;187#pragma omp target parallel for simd private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}188 for (int k = 0; k < argc; ++k)189 ++k;190#pragma omp target parallel for simd private() // expected-error {{expected expression}}191 for (int k = 0; k < argc; ++k)192 ++k;193#pragma omp target parallel for simd private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}194 for (int k = 0; k < argc; ++k)195 ++k;196#pragma omp target parallel for simd private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}197 for (int k = 0; k < argc; ++k)198 ++k;199#pragma omp target parallel for simd private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}200 for (int k = 0; k < argc; ++k)201 ++k;202#pragma omp target parallel for simd private(argc, z)203 for (int k = 0; k < argc; ++k)204 ++k;205#pragma omp target parallel for simd private(S1) // expected-error {{'S1' does not refer to a value}}206 for (int k = 0; k < argc; ++k)207 ++k;208#pragma omp target parallel for simd private(a, b) // expected-error {{private variable with incomplete type 'S1'}}209 for (int k = 0; k < argc; ++k)210 ++k;211#pragma omp target parallel for simd private(argv[1]) // expected-error {{expected variable name}}212 for (int k = 0; k < argc; ++k)213 ++k;214#pragma omp target parallel for simd private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}}215 for (int k = 0; k < argc; ++k)216 ++k;217#pragma omp target parallel for simd private(h, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}}218 for (int k = 0; k < argc; ++k)219 ++k;220#pragma omp parallel221 {222 int i;223#pragma omp target parallel for simd private(i)224 for (int k = 0; k < argc; ++k)225 ++k;226 }227#pragma omp parallel shared(i)228#pragma omp parallel private(i)229#pragma omp target parallel for simd private(j)230 for (int k = 0; k < argc; ++k)231 ++k;232#pragma omp target parallel for simd private(i)233 for (int k = 0; k < argc; ++k)234 ++k;235 static int m;236#pragma omp target parallel for simd private(m)237 for (int k = 0; k < argc; ++k)238 m = k + 2;239 240 s6 = s6_0; // expected-note {{in instantiation of member function 'S6<float>::operator=' requested here}}241 s7 = s7_0; // expected-note {{in instantiation of member function 'S7<S6<float>>::operator=' requested here}}242 return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char>' requested here}}243}244 245