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 10 void foo() { 11 } 12 13 #if __cplusplus >= 201103L 14 // expected-note@+2 4 {{declared here}} 15 #endif 16 bool foobool(int argc) { 17 return argc; 18 } 19 20 struct S1; // expected-note {{declared here}} 21 22 template <class T, typename S, int N, int ST> // expected-note {{declared here}} 23 T 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 88 int 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