251 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};21const S2 b;22const S2 ba[5];23class S3 {24 int a;25 26public:27 S3() : a(0) {}28};29const S3 ca[5];30class S4 {31 int a;32 S4(); // expected-note {{implicitly declared private here}}33 34public:35 S4(int v) : a(v) {36#pragma omp for private(a) private(this->a)37 for (int k = 0; k < v; ++k)38 ++this->a;39 }40};41class S5 {42 int a;43 S5() : a(0) {} // expected-note {{implicitly declared private here}}44 45public:46 S5(int v) : a(v) {}47 S5 &operator=(S5 &s) {48#pragma omp for private(a) private(this->a) private(s.a) // expected-error {{expected variable name or data member of current class}}49 for (int k = 0; k < s.a; ++k)50 ++s.a;51 return *this;52 }53};54 55template <typename T>56class S6 {57public:58 T a;59 60 S6() : a(0) {}61 S6(T v) : a(v) {62#pragma omp for private(a) private(this->a)63 for (int k = 0; k < v; ++k)64 ++this->a;65 }66 S6 &operator=(S6 &s) {67#pragma omp for private(a) private(this->a) private(s.a) // expected-error {{expected variable name or data member of current class}}68 for (int k = 0; k < s.a; ++k)69 ++s.a;70 return *this;71 }72};73 74template <typename T>75class S7 : public T {76 T a;77 S7() : a(0) {}78 79public:80 S7(T v) : a(v) {81#pragma omp for private(a) private(this->a) private(T::a)82 for (int k = 0; k < a.a; ++k)83 ++this->a.a;84 }85 S7 &operator=(S7 &s) {86#pragma omp for private(a) private(this->a) private(s.a) private(s.T::a) // expected-error 2 {{expected variable name or data member of current class}}87 for (int k = 0; k < s.a.a; ++k)88 ++s.a.a;89 return *this;90 }91};92 93S3 h;94#pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}95 96template <class I, class C>97int foomain(I argc, C **argv) {98 I e(4);99 I g(5);100 int i;101 int &j = i;102#pragma omp for private // expected-error {{expected '(' after 'private'}}103 for (int k = 0; k < argc; ++k)104 ++k;105#pragma omp for private( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}106 for (int k = 0; k < argc; ++k)107 ++k;108#pragma omp for private() // expected-error {{expected expression}}109 for (int k = 0; k < argc; ++k)110 ++k;111#pragma omp for private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}112 for (int k = 0; k < argc; ++k)113 ++k;114#pragma omp for private(argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}115 for (int k = 0; k < argc; ++k)116 ++k;117#pragma omp for private(argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name}}118 for (int k = 0; k < argc; ++k)119 ++k;120#pragma omp for 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 '('}}121 for (int k = 0; k < argc; ++k)122 ++k;123#pragma omp for private(S1) // expected-error {{'S1' does not refer to a value}}124 for (int k = 0; k < argc; ++k)125 ++k;126#pragma omp for private(a, b) // expected-error {{private variable with incomplete type 'S1'}}127 for (int k = 0; k < argc; ++k)128 ++k;129#pragma omp for private(argv[1]) // expected-error {{expected variable name}}130 for (int k = 0; k < argc; ++k)131 ++k;132#pragma omp for private(e, g)133 for (int k = 0; k < argc; ++k)134 ++k;135#pragma omp for private(h) // expected-error {{threadprivate or thread local variable cannot be private}}136 for (int k = 0; k < argc; ++k)137 ++k;138#pragma omp for shared(i) // expected-error {{unexpected OpenMP clause 'shared' in directive '#pragma omp for'}}139 for (int k = 0; k < argc; ++k)140 ++k;141#pragma omp parallel142 {143 int v = 0;144 int i;145#pragma omp for private(i)146 for (int k = 0; k < argc; ++k) {147 i = k;148 v += i;149 }150 }151#pragma omp parallel shared(i)152#pragma omp parallel private(i)153#pragma omp for private(j)154 for (int k = 0; k < argc; ++k)155 ++k;156#pragma omp for private(i)157 for (int k = 0; k < argc; ++k)158 ++k;159 return 0;160}161 162void bar(S4 a[2]) {163#pragma omp parallel164#pragma omp for private(a)165 for (int i = 0; i < 2; ++i)166 foo();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);181 S7<S6<float> > s7(0.0) , s7_0(1.0);182 int i;183 int &j = i;184#pragma omp for private // expected-error {{expected '(' after 'private'}}185 for (int k = 0; k < argc; ++k)186 ++k;187#pragma omp for 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 for private() // expected-error {{expected expression}}191 for (int k = 0; k < argc; ++k)192 ++k;193#pragma omp for private(argc // expected-error {{expected ')'}} expected-note {{to match this '('}}194 for (int k = 0; k < argc; ++k)195 ++k;196#pragma omp for 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 for 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 for private(argc)203 for (int k = 0; k < argc; ++k)204 ++k;205#pragma omp for private(S1) // expected-error {{'S1' does not refer to a value}}206 for (int k = 0; k < argc; ++k)207 ++k;208#pragma omp for private(a, b) // expected-error {{private variable with incomplete type 'S1'}}209 for (int k = 0; k < argc; ++k)210 ++k;211#pragma omp for private(argv[1]) // expected-error {{expected variable name}}212 for (int k = 0; k < argc; ++k)213 ++k;214#pragma omp for 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 for private(h) // expected-error {{threadprivate or thread local variable cannot be private}}218 for (int k = 0; k < argc; ++k)219 ++k;220#pragma omp for private(B::x) // expected-error {{threadprivate or thread local variable cannot be private}}221 for (int k = 0; k < argc; ++k)222 ++k;223#pragma omp for shared(i) // expected-error {{unexpected OpenMP clause 'shared' in directive '#pragma omp for'}}224 for (int k = 0; k < argc; ++k)225 ++k;226#pragma omp parallel227 {228 int i;229#pragma omp for private(i)230 for (int k = 0; k < argc; ++k)231 ++k;232 }233#pragma omp parallel shared(i)234#pragma omp parallel private(i)235#pragma omp for private(j)236 for (int k = 0; k < argc; ++k)237 ++k;238#pragma omp for private(i)239 for (int k = 0; k < argc; ++k)240 ++k;241 static int si;242#pragma omp for private(si) // OK243 for(int k = 0; k < argc; ++k)244 si = k + 1;245 246 s6 = s6_0; // expected-note {{in instantiation of member function 'S6<float>::operator=' requested here}}247 s7 = s7_0; // expected-note {{in instantiation of member function 'S7<S6<float>>::operator=' requested here}}248 return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain<int, char>' requested here}}249}250 251