Clang Project

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