1 // RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 %s -Wuninitialized
2 // RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 -std=c++98 %s -Wuninitialized
3 // RUN: %clang_cc1 -verify=expected,omp45 -fopenmp -fopenmp-version=45 -std=c++11 %s -Wuninitialized
4 // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp %s -Wuninitialized
5 // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -std=c++98 %s -Wuninitialized
6 // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp -std=c++11 %s -Wuninitialized
7 
8 // RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 %s -Wuninitialized
9 // RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 -std=c++98 %s -Wuninitialized
10 // RUN: %clang_cc1 -verify=expected,omp45 -fopenmp-simd -fopenmp-version=45 -std=c++11 %s -Wuninitialized
11 // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd %s -Wuninitialized
12 // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -std=c++98 %s -Wuninitialized
13 // RUN: %clang_cc1 -verify=expected,omp50 -fopenmp-simd -std=c++11 %s -Wuninitialized
14 
15 void foo() {
16 }
17 
18 #if __cplusplus >= 201103L
19 // expected-note@+2 4 {{declared here}}
20 #endif
21 bool foobool(int argc) {
22   return argc;
23 }
24 
25 struct S1; // expected-note {{declared here}}
26 
27 template <class T, typename S, int N, int ST> // expected-note {{declared here}}
28 T tmain(T argc, S **argv) { //expected-note 2 {{declared here}}
29   #pragma omp for collapse // expected-error {{expected '(' after 'collapse'}}
30   for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];
31   #pragma omp for collapse ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
32   for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];
33   #pragma omp for collapse () // expected-error {{expected expression}}
34   for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];
35   // expected-error@+3 {{expected ')'}} expected-note@+3 {{to match this '('}}
36   // expected-error@+2 2 {{integral constant expression}}
37   // expected-note@+1 2 {{read of non-const variable 'argc' is not allowed in a constant expression}}
38   #pragma omp for collapse (argc
39   for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];
40   // expected-error@+1 2 {{argument to 'collapse' clause must be a strictly positive integer value}}
41   #pragma omp for collapse (ST // expected-error {{expected ')'}} expected-note {{to match this '('}}
42   for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];
43   #pragma omp for collapse (1)) // expected-warning {{extra tokens at the end of '#pragma omp for' are ignored}}
44   for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];
45   #pragma omp for collapse ((ST > 0) ? 1 + ST : 2) // expected-note 2 {{as specified in 'collapse' clause}}
46   for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST]; // expected-error 2 {{expected 2 for loops after '#pragma omp for', but found only 1}}
47   // expected-error@+6 2 {{directive '#pragma omp for' cannot contain more than one 'collapse' clause}}
48   // expected-error@+5 {{argument to 'collapse' clause must be a strictly positive integer value}}
49   // expected-error@+4 2 {{integral constant expression}}
50 #if __cplusplus >= 201103L
51   // expected-note@+2 2 {{non-constexpr function 'foobool' cannot be used in a constant expression}}
52 #endif
53   #pragma omp for collapse (foobool(argc)), collapse (true), collapse (-5)
54   for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];
55   #pragma omp for collapse (S) // expected-error {{'S' does not refer to a value}}
56   for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];
57 #if __cplusplus <= 199711L
58   // expected-error@+4 2 {{integral constant expression}}
59 #else
60   // expected-error@+2 2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}}
61 #endif
62   #pragma omp for collapse (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}}
63   for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];
64   #pragma omp for collapse (1)
65   for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];
66   #pragma omp for collapse (N) // expected-error {{argument to 'collapse' clause must be a strictly positive integer value}}
67   for (T i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];
68   #pragma omp for collapse (2) // expected-note {{as specified in 'collapse' clause}}
69   foo(); // expected-error {{expected 2 for loops after '#pragma omp for'}}
70   return argc;
71 }
72 
73 int main(int argc, char **argv) {
74   #pragma omp for collapse // expected-error {{expected '(' after 'collapse'}}
75   for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];
76   #pragma omp for collapse ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}
77   for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];
78   #pragma omp for collapse () // expected-error {{expected expression}}
79   for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];
80   #pragma omp for collapse (4 // expected-error {{expected ')'}} expected-note {{to match this '('}} expected-note {{as specified in 'collapse' clause}}
81   for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4]; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
82   #pragma omp for collapse (2+2)) // expected-warning {{extra tokens at the end of '#pragma omp for' are ignored}}  expected-note {{as specified in 'collapse' clause}}
83   for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4]; // expected-error {{expected 4 for loops after '#pragma omp for', but found only 1}}
84   // expected-error@+4 {{integral constant expression}}
85 #if __cplusplus >= 201103L
86   // expected-note@+2 {{non-constexpr function 'foobool' cannot be used in a constant expression}}
87 #endif
88   #pragma omp for collapse (foobool(1) > 0 ? 1 : 2)
89   for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];
90   // expected-error@+6 {{integral constant expression}}
91 #if __cplusplus >= 201103L
92   // expected-note@+4 {{non-constexpr function 'foobool' cannot be used in a constant expression}}
93 #endif
94   // expected-error@+2 2 {{directive '#pragma omp for' cannot contain more than one 'collapse' clause}}
95   // expected-error@+1 {{argument to 'collapse' clause must be a strictly positive integer value}}
96   #pragma omp for collapse (foobool(argc)), collapse (true), collapse (-5)
97   for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];
98   #pragma omp for collapse (S1) // expected-error {{'S1' does not refer to a value}}
99   for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];
100 #if __cplusplus <= 199711L
101   // expected-error@+4 {{integral constant expression}}
102 #else
103   // expected-error@+2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}}
104 #endif
105   #pragma omp for collapse (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}}
106   for (int i = 4; i < 12; i++) argv[0][i] = argv[0][i] - argv[0][i-4];
107   // expected-error@+3 {{statement after '#pragma omp for' must be a for loop}}
108   // expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, -1, -2>' requested here}}
109   #pragma omp for collapse(collapse(tmain<int, char, -1, -2>(argc, argv) // expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}}
110   foo();
111   #pragma omp for collapse (2) // expected-note {{as specified in 'collapse' clause}}
112   foo(); // expected-error {{expected 2 for loops after '#pragma omp for'}}
113   // expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, 1, 0>' requested here}}
114   return tmain<int, char, 1, 0>(argc, argv);
115 }
116 
117 void imperfectlyNestedLoops() {
118 #pragma omp for collapse(2)      // expected-note {{as specified in 'collapse' clause}}
119   for (int i = 0; i < 10; ++i) { // expected-error {{expected 2 for loops after '#pragma omp for', but found only 1}}
120     for (int j = 0; j < 10; ++j)
121       ;
122     for (int j = 0; j < 10; ++j)
123       ;
124   }
125 #pragma omp for collapse(2)      // expected-note {{as specified in 'collapse' clause}}
126   for (int i = 0; i < 10; ++i) { // expected-error {{expected 2 for loops after '#pragma omp for', but found only 1}}
127     {
128       for (int j = 0; j < 10; ++j)
129         ;
130       for (int j = 0; j < 10; ++j)
131         ;
132     }
133     {
134       for (int j = 0; j < 10; ++j)
135         ;
136       for (int j = 0; j < 10; ++j)
137         ;
138     }
139   }
140 #pragma omp for collapse(2)      // omp45-note {{as specified in 'collapse' clause}}
141   for (int i = 0; i < 10; ++i) { // omp45-error {{expected 2 for loops after '#pragma omp for', but found only 1}}
142     int a, b, c;
143     for (int j = 0; j < 10; ++j)
144       ;
145     {
146       for (int j = 0; j < 10; ++j)
147         ;
148       for (int j = 0; j < 10; ++j)
149         ;
150     }
151   }
152 }
153