11c1d9d9dSAlexey Bataev // RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 -ferror-limit 150 -o - %s -Wuninitialized
21c1d9d9dSAlexey Bataev // RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 -std=c++98 -ferror-limit 150 -o - %s -Wuninitialized
31c1d9d9dSAlexey Bataev // RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 -std=c++11 -ferror-limit 150 -o - %s -Wuninitialized
4ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -ferror-limit 150 -o - %s -Wuninitialized
5ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -std=c++98 -ferror-limit 150 -o - %s -Wuninitialized
6ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -std=c++11 -ferror-limit 150 -o - %s -Wuninitialized
747d6094dScchen
81c1d9d9dSAlexey Bataev // RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 -ferror-limit 150 -o - %s -Wuninitialized
91c1d9d9dSAlexey Bataev // RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 -std=c++98 -ferror-limit 150 -o - %s -Wuninitialized
101c1d9d9dSAlexey Bataev // RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 -std=c++11 -ferror-limit 150 -o - %s -Wuninitialized
11ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -ferror-limit 150 -o - %s -Wuninitialized
12ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -std=c++98 -ferror-limit 150 -o - %s -Wuninitialized
13ff260ad0SSaiyedul Islam // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -std=c++11 -ferror-limit 150 -o - %s -Wuninitialized
1447d6094dScchen
1547d6094dScchen extern int omp_default_mem_alloc;
xxx(int argc)1647d6094dScchen void xxx(int argc) {
1747d6094dScchen int fp; // expected-note {{initialize the variable 'fp' to silence this warning}}
1847d6094dScchen #pragma omp parallel master reduction(+:fp) // expected-warning {{variable 'fp' is uninitialized when used here}}
1947d6094dScchen {
2047d6094dScchen for (int i = 0; i < 10; ++i)
2147d6094dScchen ;
2247d6094dScchen }
2347d6094dScchen }
2447d6094dScchen
foo()2547d6094dScchen void foo() {
2647d6094dScchen }
2747d6094dScchen
foobool(int argc)2847d6094dScchen bool foobool(int argc) {
2947d6094dScchen return argc;
3047d6094dScchen }
3147d6094dScchen
foobar(int & ref)3247d6094dScchen void foobar(int &ref) {
3347d6094dScchen #pragma omp parallel master reduction(+:ref)
3447d6094dScchen {
3547d6094dScchen foo();
3647d6094dScchen }
3747d6094dScchen }
3847d6094dScchen
3947d6094dScchen struct S1; // expected-note {{declared here}} expected-note 4 {{forward declaration of 'S1'}}
4047d6094dScchen extern S1 a;
4147d6094dScchen class S2 {
4247d6094dScchen mutable int a;
operator +(const S2 & arg)4347d6094dScchen S2 &operator+(const S2 &arg) { return (*this); } // expected-note 3 {{implicitly declared private here}}
4447d6094dScchen
4547d6094dScchen public:
S2()4647d6094dScchen S2() : a(0) {}
S2(S2 & s2)4747d6094dScchen S2(S2 &s2) : a(s2.a) {}
4847d6094dScchen static float S2s; // expected-note 2 {{static data member is predetermined as shared}}
4947d6094dScchen static const float S2sc; // expected-note 2 {{'S2sc' declared here}}
5047d6094dScchen };
5147d6094dScchen const float S2::S2sc = 0;
5247d6094dScchen S2 b; // expected-note 3 {{'b' defined here}}
5347d6094dScchen const S2 ba[5]; // expected-note 2 {{'ba' defined here}}
5447d6094dScchen class S3 {
5547d6094dScchen int a;
5647d6094dScchen
5747d6094dScchen public:
5847d6094dScchen int b;
S3()5947d6094dScchen S3() : a(0) {}
S3(const S3 & s3)6047d6094dScchen S3(const S3 &s3) : a(s3.a) {}
operator +(const S3 & arg1)6147d6094dScchen S3 operator+(const S3 &arg1) { return arg1; }
6247d6094dScchen };
operator +(const S3 & arg1,const S3 & arg2)6347d6094dScchen int operator+(const S3 &arg1, const S3 &arg2) { return 5; }
6447d6094dScchen S3 c; // expected-note 3 {{'c' defined here}}
6547d6094dScchen const S3 ca[5]; // expected-note 2 {{'ca' defined here}}
6647d6094dScchen extern const int f; // expected-note 4 {{'f' declared here}}
6747d6094dScchen class S4 {
6847d6094dScchen int a;
6947d6094dScchen S4(); // expected-note {{implicitly declared private here}}
7047d6094dScchen S4(const S4 &s4);
operator +(const S4 & arg)7147d6094dScchen S4 &operator+(const S4 &arg) { return (*this); }
7247d6094dScchen
7347d6094dScchen public:
S4(int v)7447d6094dScchen S4(int v) : a(v) {}
7547d6094dScchen };
operator &=(S4 & arg1,S4 & arg2)7647d6094dScchen S4 &operator&=(S4 &arg1, S4 &arg2) { return arg1; }
7747d6094dScchen class S5 {
7847d6094dScchen int a;
S5()7947d6094dScchen S5() : a(0) {} // expected-note {{implicitly declared private here}}
S5(const S5 & s5)8047d6094dScchen S5(const S5 &s5) : a(s5.a) {}
8147d6094dScchen S5 &operator+(const S5 &arg);
8247d6094dScchen
8347d6094dScchen public:
S5(int v)8447d6094dScchen S5(int v) : a(v) {}
8547d6094dScchen };
8647d6094dScchen class S6 { // expected-note 3 {{candidate function (the implicit copy assignment operator) not viable: no known conversion from 'int' to 'const S6' for 1st argument}}
8747d6094dScchen #if __cplusplus >= 201103L // C++11 or later
8847d6094dScchen // expected-note@-2 3 {{candidate function (the implicit move assignment operator) not viable}}
8947d6094dScchen #endif
9047d6094dScchen int a;
9147d6094dScchen
9247d6094dScchen public:
S6()9347d6094dScchen S6() : a(6) {}
operator int()9447d6094dScchen operator int() { return 6; }
9547d6094dScchen } o;
9647d6094dScchen
9747d6094dScchen S3 h, k;
9847d6094dScchen #pragma omp threadprivate(h) // expected-note 2 {{defined as threadprivate or thread local}}
9947d6094dScchen
10047d6094dScchen template <class T> // expected-note {{declared here}}
tmain(T argc)10147d6094dScchen T tmain(T argc) {
10247d6094dScchen const T d = T(); // expected-note 4 {{'d' defined here}}
10347d6094dScchen const T da[5] = {T()}; // expected-note 2 {{'da' defined here}}
10447d6094dScchen T qa[5] = {T()};
10547d6094dScchen T i, z;
10647d6094dScchen T &j = i; // expected-note 4 {{'j' defined here}}
10747d6094dScchen S3 &p = k; // expected-note 2 {{'p' defined here}}
10847d6094dScchen const T &r = da[(int)i]; // expected-note 2 {{'r' defined here}}
10947d6094dScchen T &q = qa[(int)i]; // expected-note 2 {{'q' defined here}}
11047d6094dScchen T fl;
11147d6094dScchen #pragma omp parallel master reduction // expected-error {{expected '(' after 'reduction'}}
11247d6094dScchen {
11347d6094dScchen foo();
11447d6094dScchen }
11547d6094dScchen #pragma omp parallel master reduction + // expected-error {{expected '(' after 'reduction'}} expected-warning {{extra tokens at the end of '#pragma omp parallel master' are ignored}}
11647d6094dScchen {
11747d6094dScchen foo();
11847d6094dScchen }
11947d6094dScchen #pragma omp parallel master reduction( // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}}
12047d6094dScchen {
12147d6094dScchen foo();
12247d6094dScchen }
12347d6094dScchen #pragma omp parallel master reduction(- // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
12447d6094dScchen {
12547d6094dScchen foo();
12647d6094dScchen }
12747d6094dScchen #pragma omp parallel master reduction() // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}}
12847d6094dScchen {
12947d6094dScchen foo();
13047d6094dScchen }
13147d6094dScchen #pragma omp parallel master reduction(*) // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}}
13247d6094dScchen {
13347d6094dScchen foo();
13447d6094dScchen }
13547d6094dScchen #pragma omp parallel master reduction(\) // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}}
13647d6094dScchen {
13747d6094dScchen foo();
13847d6094dScchen }
13947d6094dScchen #pragma omp parallel master reduction(& : argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{invalid operands to binary expression ('float' and 'float')}}
14047d6094dScchen {
14147d6094dScchen foo();
14247d6094dScchen }
14347d6094dScchen #pragma omp parallel master reduction(| : argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{invalid operands to binary expression ('float' and 'float')}}
14447d6094dScchen {
14547d6094dScchen foo();
14647d6094dScchen }
14747d6094dScchen #pragma omp parallel master reduction(|| : argc ? i : argc) // expected-error 2 {{expected variable name, array element or array section}}
14847d6094dScchen {
14947d6094dScchen foo();
15047d6094dScchen }
15147d6094dScchen #pragma omp parallel master reduction(foo : argc) //expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max' or declare reduction for type 'float'}} expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max' or declare reduction for type 'int'}}
15247d6094dScchen {
15347d6094dScchen foo();
15447d6094dScchen }
15547d6094dScchen #pragma omp parallel master reduction(&& : 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 '('}}
15647d6094dScchen {
15747d6094dScchen foo();
15847d6094dScchen }
15947d6094dScchen #pragma omp parallel master reduction(^ : T) // expected-error {{'T' does not refer to a value}}
16047d6094dScchen {
16147d6094dScchen foo();
16247d6094dScchen }
16347d6094dScchen #pragma omp parallel master reduction(+ : z, a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 3 {{const-qualified variable cannot be reduction}} expected-error 2 {{'operator+' is a private member of 'S2'}}
16447d6094dScchen {
16547d6094dScchen foo();
16647d6094dScchen }
16747d6094dScchen #pragma omp parallel master reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 4 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 3 {{const-qualified variable cannot be reduction}}
16847d6094dScchen {
16947d6094dScchen foo();
17047d6094dScchen }
17147d6094dScchen #pragma omp parallel master reduction(max : h.b) // expected-error {{expected variable name, array element or array section}}
17247d6094dScchen {
17347d6094dScchen foo();
17447d6094dScchen }
17547d6094dScchen #pragma omp parallel master reduction(+ : ba) // expected-error {{const-qualified variable cannot be reduction}}
17647d6094dScchen {
17747d6094dScchen foo();
17847d6094dScchen }
17947d6094dScchen #pragma omp parallel master reduction(* : ca) // expected-error {{const-qualified variable cannot be reduction}}
18047d6094dScchen {
18147d6094dScchen foo();
18247d6094dScchen }
18347d6094dScchen #pragma omp parallel master reduction(- : da) // expected-error {{const-qualified variable cannot be reduction}} expected-error {{const-qualified variable cannot be reduction}}
18447d6094dScchen {
18547d6094dScchen foo();
18647d6094dScchen }
18747d6094dScchen #pragma omp parallel master reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}}
18847d6094dScchen {
18947d6094dScchen foo();
19047d6094dScchen }
19147d6094dScchen #pragma omp parallel master reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}}
19247d6094dScchen {
19347d6094dScchen foo();
19447d6094dScchen }
19547d6094dScchen #pragma omp parallel master reduction(&& : S2::S2sc) // expected-error {{const-qualified variable cannot be reduction}}
19647d6094dScchen {
19747d6094dScchen foo();
19847d6094dScchen }
19947d6094dScchen #pragma omp parallel master reduction(+ : h, k) // expected-error {{threadprivate or thread local variable cannot be reduction}}
20047d6094dScchen {
20147d6094dScchen foo();
20247d6094dScchen }
20347d6094dScchen #pragma omp parallel master reduction(+ : o) // expected-error 2 {{no viable overloaded '='}}
20447d6094dScchen {
20547d6094dScchen foo();
20647d6094dScchen }
20747d6094dScchen #pragma omp parallel master private(i), reduction(+ : j), reduction(+ : q) // expected-error 4 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
20847d6094dScchen {
20947d6094dScchen foo();
21047d6094dScchen }
21147d6094dScchen #pragma omp parallel private(k)
21247d6094dScchen #pragma omp parallel master reduction(+ : p), reduction(+ : p) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
21347d6094dScchen {
21447d6094dScchen foo();
21547d6094dScchen }
21647d6094dScchen #pragma omp parallel master reduction(+ : p), reduction(+ : p) // expected-error 2 {{variable can appear only once in OpenMP 'reduction' clause}} expected-note 2 {{previously referenced here}}
21747d6094dScchen {
21847d6094dScchen foo();
21947d6094dScchen }
22047d6094dScchen #pragma omp parallel master reduction(+ : r) // expected-error 2 {{const-qualified variable cannot be reduction}}
22147d6094dScchen {
22247d6094dScchen foo();
22347d6094dScchen }
22447d6094dScchen #pragma omp parallel shared(i)
22547d6094dScchen #pragma omp parallel reduction(min : i)
22647d6094dScchen #pragma omp parallel master reduction(max : j) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
22747d6094dScchen {
22847d6094dScchen foo();
22947d6094dScchen }
23047d6094dScchen #pragma omp parallel private(fl)
23147d6094dScchen #pragma omp parallel master reduction(+ : fl)
23247d6094dScchen {
23347d6094dScchen foo();
23447d6094dScchen }
23547d6094dScchen #pragma omp parallel reduction(* : fl)
23647d6094dScchen #pragma omp parallel master reduction(+ : fl)
23747d6094dScchen {
23847d6094dScchen foo();
23947d6094dScchen }
24047d6094dScchen
24147d6094dScchen return T();
24247d6094dScchen }
24347d6094dScchen
24447d6094dScchen namespace A {
24547d6094dScchen double x;
24647d6094dScchen #pragma omp threadprivate(x) // expected-note {{defined as threadprivate or thread local}}
24747d6094dScchen }
24847d6094dScchen namespace B {
24947d6094dScchen using A::x;
25047d6094dScchen }
25147d6094dScchen
main(int argc,char ** argv)25247d6094dScchen int main(int argc, char **argv) {
25347d6094dScchen const int d = 5; // expected-note 2 {{'d' defined here}}
25447d6094dScchen const int da[5] = {0}; // expected-note {{'da' defined here}}
25547d6094dScchen int qa[5] = {0};
25647d6094dScchen S4 e(4);
25747d6094dScchen S5 g(5);
25847d6094dScchen int i, z;
25947d6094dScchen int &j = i; // expected-note 2 {{'j' defined here}}
26047d6094dScchen S3 &p = k; // expected-note 2 {{'p' defined here}}
26147d6094dScchen const int &r = da[i]; // expected-note {{'r' defined here}}
26247d6094dScchen int &q = qa[i]; // expected-note {{'q' defined here}}
26347d6094dScchen float fl;
26447d6094dScchen #pragma omp parallel master reduction // expected-error {{expected '(' after 'reduction'}}
26547d6094dScchen {
26647d6094dScchen foo();
26747d6094dScchen }
26847d6094dScchen #pragma omp parallel master reduction + // expected-error {{expected '(' after 'reduction'}} expected-warning {{extra tokens at the end of '#pragma omp parallel master' are ignored}}
26947d6094dScchen {
27047d6094dScchen foo();
27147d6094dScchen }
27247d6094dScchen #pragma omp parallel master reduction( // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected ')'}} expected-note {{to match this '('}}
27347d6094dScchen {
27447d6094dScchen foo();
27547d6094dScchen }
27647d6094dScchen #pragma omp parallel master reduction(- // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
27747d6094dScchen {
27847d6094dScchen foo();
27947d6094dScchen }
28047d6094dScchen #pragma omp parallel master reduction() // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}}
28147d6094dScchen {
28247d6094dScchen foo();
28347d6094dScchen }
28447d6094dScchen #pragma omp parallel master reduction(*) // expected-warning {{missing ':' after reduction identifier - ignoring}} expected-error {{expected expression}}
28547d6094dScchen {
28647d6094dScchen foo();
28747d6094dScchen }
28847d6094dScchen #pragma omp parallel master reduction(\) // expected-error {{expected unqualified-id}} expected-warning {{missing ':' after reduction identifier - ignoring}}
28947d6094dScchen {
29047d6094dScchen foo();
29147d6094dScchen }
29247d6094dScchen #pragma omp parallel master reduction(foo : argc // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-error {{incorrect reduction identifier, expected one of '+', '-', '*', '&', '|', '^', '&&', '||', 'min' or 'max'}}
29347d6094dScchen {
29447d6094dScchen foo();
29547d6094dScchen }
29647d6094dScchen #pragma omp parallel master reduction(| : argc, // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
29747d6094dScchen {
29847d6094dScchen foo();
29947d6094dScchen }
30047d6094dScchen #pragma omp parallel master reduction(|| : argc > 0 ? argv[1] : argv[2]) // expected-error {{expected variable name, array element or array section}}
30147d6094dScchen {
30247d6094dScchen foo();
30347d6094dScchen }
30447d6094dScchen #pragma omp parallel master reduction(~ : argc) // expected-error {{expected unqualified-id}}
30547d6094dScchen {
30647d6094dScchen foo();
30747d6094dScchen }
30847d6094dScchen #pragma omp parallel master reduction(&& : argc)
30947d6094dScchen {
31047d6094dScchen foo();
31147d6094dScchen }
31247d6094dScchen #pragma omp parallel master reduction(^ : S1) // expected-error {{'S1' does not refer to a value}}
31347d6094dScchen {
31447d6094dScchen foo();
31547d6094dScchen }
31647d6094dScchen #pragma omp parallel master reduction(+ : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{const-qualified variable cannot be reduction}} expected-error {{'operator+' is a private member of 'S2'}}
31747d6094dScchen {
31847d6094dScchen foo();
31947d6094dScchen }
32047d6094dScchen #pragma omp parallel master reduction(min : a, b, c, d, f) // expected-error {{a reduction list item with incomplete type 'S1'}} expected-error 2 {{arguments of OpenMP clause 'reduction' for 'min' or 'max' must be of arithmetic type}} expected-error 2 {{const-qualified variable cannot be reduction}}
32147d6094dScchen {
32247d6094dScchen foo();
32347d6094dScchen }
32447d6094dScchen #pragma omp parallel master reduction(max : h.b) // expected-error {{expected variable name, array element or array section}}
32547d6094dScchen {
32647d6094dScchen foo();
32747d6094dScchen }
32847d6094dScchen #pragma omp parallel master reduction(+ : ba) // expected-error {{const-qualified variable cannot be reduction}}
32947d6094dScchen {
33047d6094dScchen foo();
33147d6094dScchen }
33247d6094dScchen #pragma omp parallel master reduction(* : ca) // expected-error {{const-qualified variable cannot be reduction}}
33347d6094dScchen {
33447d6094dScchen foo();
33547d6094dScchen }
33647d6094dScchen #pragma omp parallel master reduction(- : da) // expected-error {{const-qualified variable cannot be reduction}}
33747d6094dScchen {
33847d6094dScchen foo();
33947d6094dScchen }
34047d6094dScchen #pragma omp parallel master reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}}
34147d6094dScchen {
34247d6094dScchen foo();
34347d6094dScchen }
34447d6094dScchen #pragma omp parallel master reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}}
34547d6094dScchen {
34647d6094dScchen foo();
34747d6094dScchen }
34847d6094dScchen #pragma omp parallel master reduction(&& : S2::S2sc) // expected-error {{const-qualified variable cannot be reduction}}
34947d6094dScchen {
35047d6094dScchen foo();
35147d6094dScchen }
352*f90abac6SMike Rice #pragma omp parallel master reduction(& : e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} expected-error {{invalid operands to binary expression ('S5' and 'S5')}}
35347d6094dScchen {
35447d6094dScchen foo();
35547d6094dScchen }
35647d6094dScchen #pragma omp parallel master reduction(+ : h, k, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be reduction}}
35747d6094dScchen {
35847d6094dScchen foo();
35947d6094dScchen }
36047d6094dScchen #pragma omp parallel master reduction(+ : o, z) // expected-error {{no viable overloaded '='}}
36147d6094dScchen {
36247d6094dScchen foo();
36347d6094dScchen }
36447d6094dScchen #pragma omp parallel master private(i), reduction(+ : j), reduction(+ : q) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
36547d6094dScchen {
36647d6094dScchen foo();
36747d6094dScchen }
36847d6094dScchen #pragma omp parallel private(k)
36947d6094dScchen #pragma omp parallel master reduction(+ : p), reduction(+ : p) // expected-error 2 {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
37047d6094dScchen {
37147d6094dScchen foo();
37247d6094dScchen }
37347d6094dScchen #pragma omp parallel master reduction(+ : p), reduction(+ : p) // expected-error {{variable can appear only once in OpenMP 'reduction' clause}} expected-note {{previously referenced here}}
37447d6094dScchen {
37547d6094dScchen foo();
37647d6094dScchen }
37747d6094dScchen #pragma omp parallel master reduction(+ : r) // expected-error {{const-qualified variable cannot be reduction}}
37847d6094dScchen {
37947d6094dScchen foo();
38047d6094dScchen }
38147d6094dScchen #pragma omp parallel shared(i)
38247d6094dScchen #pragma omp parallel reduction(min : i)
38347d6094dScchen #pragma omp parallel master reduction(max : j) // expected-error {{argument of OpenMP clause 'reduction' must reference the same object in all threads}}
38447d6094dScchen {
38547d6094dScchen foo();
38647d6094dScchen }
38747d6094dScchen #pragma omp parallel private(fl)
38847d6094dScchen #pragma omp parallel master reduction(+ : fl)
38947d6094dScchen {
39047d6094dScchen foo();
39147d6094dScchen }
39247d6094dScchen #pragma omp parallel reduction(* : fl)
39347d6094dScchen #pragma omp parallel master reduction(+ : fl)
39447d6094dScchen {
39547d6094dScchen foo();
39647d6094dScchen }
39747d6094dScchen static int m;
39847d6094dScchen #pragma omp parallel master reduction(+ : m) // OK
39947d6094dScchen {
40047d6094dScchen foo();
40147d6094dScchen }
4021c1d9d9dSAlexey Bataev #pragma omp parallel master reduction(task, + : m) // omp45-error 2 {{expected expression}} omp45-warning {{missing ':' after reduction identifier - ignoring}}
4031c1d9d9dSAlexey Bataev {
4041c1d9d9dSAlexey Bataev foo();
4051c1d9d9dSAlexey Bataev }
40647d6094dScchen
40747d6094dScchen return tmain(argc) + tmain(fl); // expected-note {{in instantiation of function template specialization 'tmain<int>' requested here}} expected-note {{in instantiation of function template specialization 'tmain<float>' requested here}}
40847d6094dScchen }
409