305 lines · cpp
1// RUN: %clang_cc1 -verify -fopenmp %s -Wuninitialized2// RUN: %clang_cc1 -verify=expected,omp52 -fopenmp -fopenmp-version=52 -DOMP52 %s -Wuninitialized3 4// RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized5// RUN: %clang_cc1 -verify=expected,omp52 -fopenmp-simd -fopenmp-version=52 -DOMP52 %s -Wuninitialized6 7#pragma omp requires dynamic_allocators8typedef void **omp_allocator_handle_t;9extern const omp_allocator_handle_t omp_null_allocator;10extern const omp_allocator_handle_t omp_default_mem_alloc;11extern const omp_allocator_handle_t omp_large_cap_mem_alloc;12extern const omp_allocator_handle_t omp_const_mem_alloc;13extern const omp_allocator_handle_t omp_high_bw_mem_alloc;14extern const omp_allocator_handle_t omp_low_lat_mem_alloc;15extern const omp_allocator_handle_t omp_cgroup_mem_alloc;16extern const omp_allocator_handle_t omp_pteam_mem_alloc;17extern const omp_allocator_handle_t omp_thread_mem_alloc;18 19void xxx(int argc) {20 int i, lin, step_sz; // expected-note {{initialize the variable 'lin' to silence this warning}} expected-note {{initialize the variable 'step_sz' to silence this warning}}21#pragma omp target simd linear(i, lin : step_sz) // expected-warning {{variable 'lin' is uninitialized when used here}} expected-warning {{variable 'step_sz' is uninitialized when used here}}22 for (i = 0; i < 10; ++i)23 ;24}25 26namespace X {27int x;28};29 30struct B {31 static int ib; // expected-note {{'B::ib' declared here}}32 static int bfoo() { return 8; }33};34 35int bfoo() { return 4; }36 37int z;38const int C1 = 1;39const int C2 = 2;40void test_linear_colons() {41 int B = 0;42#pragma omp target simd linear(B : bfoo())43 for (int i = 0; i < 10; ++i)44 ;45// expected-error@+1 {{unexpected ':' in nested name specifier; did you mean '::'}}46#pragma omp target simd linear(B::ib : B : bfoo())47 for (int i = 0; i < 10; ++i)48 ;49// expected-error@+1 {{use of undeclared identifier 'ib'; did you mean 'B::ib'}}50#pragma omp target simd linear(B : ib)51 for (int i = 0; i < 10; ++i)52 ;53// expected-error@+1 {{unexpected ':' in nested name specifier; did you mean '::'?}}54#pragma omp target simd linear(z : B : ib)55 for (int i = 0; i < 10; ++i)56 ;57#pragma omp target simd linear(B : B::bfoo())58 for (int i = 0; i < 10; ++i)59 ;60#pragma omp target simd linear(X::x : ::z)61 for (int i = 0; i < 10; ++i)62 ;63#pragma omp target simd linear(B, ::z, X::x)64 for (int i = 0; i < 10; ++i)65 ;66#pragma omp target simd linear(::z)67 for (int i = 0; i < 10; ++i)68 ;69// expected-error@+1 {{expected variable name}}70#pragma omp target simd linear(B::bfoo())71 for (int i = 0; i < 10; ++i)72 ;73#pragma omp target simd linear(B::ib, B : C1 + C2)74 for (int i = 0; i < 10; ++i)75 ;76}77 78template <int L, class T, class N>79T test_template(T *arr, N num) {80 N i;81 T sum = (T)0;82 T ind2 = -num * L; // expected-note {{'ind2' defined here}}83// expected-error@+1 {{argument of a linear clause should be of integral or pointer type}}84#pragma omp target simd linear(ind2 : L)85 for (i = 0; i < num; ++i) {86 T cur = arr[(int)ind2];87 ind2 += L;88 sum += cur;89 }90 return T();91}92 93template <int LEN>94int test_warn() {95 int ind2 = 0;96// expected-warning@+1 {{zero linear step ('ind2' should probably be const)}}97#pragma omp target simd linear(ind2 : LEN)98 for (int i = 0; i < 100; i++) {99 ind2 += LEN;100 }101 return ind2;102}103 104struct S1; // expected-note 2 {{declared here}} expected-note 2 {{forward declaration of 'S1'}}105extern S1 a;106class S2 {107 mutable int a;108 109public:110 S2() : a(0) {}111};112const S2 b; // expected-note 2 {{'b' defined here}}113const S2 ba[5];114class S3 {115 int a;116 117public:118 S3() : a(0) {}119};120const S3 ca[5];121class S4 {122 int a;123 S4();124 125public:126 S4(int v) : a(v) {}127};128class S5 {129 int a;130 S5() : a(0) {}131 132public:133 S5(int v) : a(v) {}134};135 136S3 h;137#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}138 139template <class I, class C>140int foomain(I argc, C **argv) {141 I e(4);142 I g(5);143 int i, z;144 int &j = i;145#pragma omp target simd linear // expected-error {{expected '(' after 'linear'}}146 for (int k = 0; k < argc; ++k)147 ++k;148#pragma omp target simd linear( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}149 for (int k = 0; k < argc; ++k)150 ++k;151#pragma omp target simd linear() // expected-error {{expected expression}}152 for (int k = 0; k < argc; ++k)153 ++k;154#pragma omp target simd linear(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}155 for (int k = 0; k < argc; ++k)156 ++k;157#pragma omp target simd linear(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}158 for (int k = 0; k < argc; ++k)159 ++k;160#pragma omp target simd linear(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}161 for (int k = 0; k < argc; ++k)162 ++k;163#pragma omp target simd linear(argc : 5) 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 '('}}164 for (int k = 0; k < argc; ++k)165 ++k;166#pragma omp target simd linear(S1) // expected-error {{'S1' does not refer to a value}}167 for (int k = 0; k < argc; ++k)168 ++k;169// expected-error@+2 {{linear variable with incomplete type 'S1'}}170// expected-error@+1 {{argument of a linear clause should be of integral or pointer type, not 'S2'}}171#pragma omp target simd linear(a, b : B::ib)172 for (int k = 0; k < argc; ++k)173 ++k;174#pragma omp target simd linear(argv[1]) // expected-error {{expected variable name}}175 for (int k = 0; k < argc; ++k)176 ++k;177#pragma omp target simd allocate(omp_thread_mem_alloc: e) linear(e, g) // expected-warning {{allocator with the 'thread' trait access has unspecified behavior on 'target simd' directive}}178 for (int k = 0; k < argc; ++k)179 ++k;180#pragma omp target simd linear(h) // expected-error {{threadprivate or thread local variable cannot be linear}}181 for (int k = 0; k < argc; ++k)182 ++k;183#pragma omp target simd linear(i, z)184 for (int k = 0; k < argc; ++k)185 ++k;186#pragma omp parallel187 {188 int v = 0;189 int i;190#pragma omp target simd linear(v : i)191 for (int k = 0; k < argc; ++k) {192 i = k;193 v += i;194 }195 }196#pragma omp target simd linear(j)197 for (int k = 0; k < argc; ++k)198 ++k;199 int v = 0;200#pragma omp target simd linear(v : j)201 for (int k = 0; k < argc; ++k) {202 ++k;203 v += j;204 }205#pragma omp target simd linear(i)206 for (int k = 0; k < argc; ++k)207 ++k;208 return 0;209}210 211namespace A {212double x;213#pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}214}215namespace C {216using A::x;217}218 219int main(int argc, char **argv) {220 double darr[100];221 // expected-note@+1 {{in instantiation of function template specialization 'test_template<-4, double, int>' requested here}}222 test_template<-4>(darr, 4);223 // expected-note@+1 {{in instantiation of function template specialization 'test_warn<0>' requested here}}224 test_warn<0>();225 226 S4 e(4); // expected-note {{'e' defined here}}227 S5 g(5); // expected-note {{'g' defined here}}228 int i, z;229 int &j = i;230#pragma omp target simd linear // expected-error {{expected '(' after 'linear'}}231 for (int k = 0; k < argc; ++k)232 ++k;233#pragma omp target simd linear( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}234 for (int k = 0; k < argc; ++k)235 ++k;236#pragma omp target simd linear() // expected-error {{expected expression}}237 for (int k = 0; k < argc; ++k)238 ++k;239#pragma omp target simd linear(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}240 for (int k = 0; k < argc; ++k)241 ++k;242#pragma omp target simd linear(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}243 for (int k = 0; k < argc; ++k)244 ++k;245#pragma omp target simd linear(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}246 for (int k = 0; k < argc; ++k)247 ++k;248#pragma omp target simd linear(argc, z)249 for (int k = 0; k < argc; ++k)250 ++k;251#pragma omp target simd linear(S1) // expected-error {{'S1' does not refer to a value}}252 for (int k = 0; k < argc; ++k)253 ++k;254// expected-error@+2 {{linear variable with incomplete type 'S1'}}255// expected-error@+1 {{argument of a linear clause should be of integral or pointer type, not 'S2'}}256#pragma omp target simd linear(a, b)257 for (int k = 0; k < argc; ++k)258 ++k;259#pragma omp target simd linear(argv[1]) // expected-error {{expected variable name}}260 for (int k = 0; k < argc; ++k)261 ++k;262// expected-error@+2 {{argument of a linear clause should be of integral or pointer type, not 'S4'}}263// expected-error@+1 {{argument of a linear clause should be of integral or pointer type, not 'S5'}}264#pragma omp target simd linear(e, g)265 for (int k = 0; k < argc; ++k)266 ++k;267#pragma omp target simd linear(h, C::x) // expected-error 2 {{threadprivate or thread local variable cannot be linear}}268 for (int k = 0; k < argc; ++k)269 ++k;270#pragma omp parallel271 {272 int i;273#pragma omp target simd linear(i)274 for (int k = 0; k < argc; ++k)275 ++k;276#ifdef OMP52277#pragma omp target simd linear(i : uval, step(4)) // expected-error {{variable of non-reference type 'int' can be used only with 'val' modifier, but used with 'uval'}}278#else279#pragma omp target simd linear(i : 4)280#endif281 for (int k = 0; k < argc; ++k) {282 ++k;283 i += 4;284 }285 }286#ifdef OMP52287#pragma omp target simd linear(j: step() //omp52-error 2 {{expected expression}} omp52-error{{expected ')'}} omp52-note{{to match this '('}}288#else289#pragma omp target simd linear(j)290#endif291 for (int k = 0; k < argc; ++k)292 ++k;293#ifdef OMP52294#pragma omp target simd linear(i: step(1), step(2)) // omp52-error {{multiple 'step size' found in linear clause}}295#else296#pragma omp target simd linear(i)297#endif298 for (int k = 0; k < argc; ++k)299 ++k;300 301 foomain<int, char>(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char>' requested here}}302 return 0;303}304 305