Clang Project

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