179 lines · cpp
1// RUN: %clang_cc1 -verify -fopenmp %s -Wuninitialized2// RUN: %clang_cc1 -verify -fopenmp -std=c++98 %s -Wuninitialized3// RUN: %clang_cc1 -verify -fopenmp -std=c++11 %s -Wuninitialized4 5// RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized6// RUN: %clang_cc1 -verify -fopenmp-simd -std=c++98 %s -Wuninitialized7// RUN: %clang_cc1 -verify -fopenmp-simd -std=c++11 %s -Wuninitialized8 9// expected-note@* 0+{{declared here}}10 11void foo() {12}13 14bool foobool(int argc) {15 return argc;16}17 18struct S1;19 20template <class T, typename S, int N, int ST>21T tmain(T argc, S **argv) {22 23#pragma omp target24#pragma omp teams25#pragma omp distribute parallel for simd safelen // expected-error {{expected '(' after 'safelen'}}26 for (int i = ST; i < N; i++)27 argv[0][i] = argv[0][i] - argv[0][i-ST];28 29#pragma omp target30#pragma omp teams31#pragma omp distribute parallel for simd safelen ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}32 for (int i = ST; i < N; i++)33 argv[0][i] = argv[0][i] - argv[0][i-ST];34 35#pragma omp target36#pragma omp teams37#pragma omp distribute parallel for simd safelen () // expected-error {{expected expression}}38 for (int i = ST; i < N; i++) argv[0][i] = argv[0][i] - argv[0][i-ST];39 40#pragma omp target41#pragma omp teams42#pragma omp distribute parallel for simd safelen (argc // expected-note {{to match this '('}} expected-error 2 {{integral constant expression}} expected-note 0+{{constant expression}} expected-error {{expected ')'}}43 for (int i = ST; i < N; i++) 44 argv[0][i] = argv[0][i] - argv[0][i-ST];45 46#pragma omp target47#pragma omp teams48#pragma omp distribute parallel for simd safelen (ST // expected-error {{argument to 'safelen' clause must be a strictly positive integer value}} expected-error {{expected ')'}} expected-note {{to match this '('}}49 for (int i = ST; i < N; i++)50 argv[0][i] = argv[0][i] - argv[0][i-ST];51 52#pragma omp target53#pragma omp teams54#pragma omp distribute parallel for simd safelen (1)) // expected-warning {{extra tokens at the end of '#pragma omp distribute parallel for simd' are ignored}}55 for (int i = ST; i < N; i++)56 argv[0][i] = argv[0][i] - argv[0][i-ST];57 58#pragma omp target59#pragma omp teams60#pragma omp distribute parallel for simd safelen ((ST > 0) ? 1 + ST : 2)61 for (int i = ST; i < N; i++) 62 argv[0][i] = argv[0][i] - argv[0][i-ST];63 64#pragma omp target65#pragma omp teams66// expected-error@+3 2 {{directive '#pragma omp distribute parallel for simd' cannot contain more than one 'safelen' clause}}67// expected-error@+2 {{argument to 'safelen' clause must be a strictly positive integer value}}68// expected-error@+1 2 {{integral constant expression}} expected-note@+1 0+{{constant expression}}69#pragma omp distribute parallel for simd safelen (foobool(argc)), safelen (true), safelen (-5)70 for (int i = ST; i < N; i++)71 argv[0][i] = argv[0][i] - argv[0][i-ST];72 73#pragma omp target74#pragma omp teams75#pragma omp distribute parallel for simd safelen (S) // expected-error {{'S' does not refer to a value}}76 for (int i = ST; i < N; i++)77 argv[0][i] = argv[0][i] - argv[0][i-ST];78 79#if __cplusplus <= 199711L80 // expected-error@+6 2 {{integral constant expression}} expected-note@+6 0+{{constant expression}}81#else82 // expected-error@+4 2 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}}83#endif84#pragma omp target85#pragma omp teams86#pragma omp distribute parallel for simd safelen (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}}87 for (int i = ST; i < N; i++)88 argv[0][i] = argv[0][i] - argv[0][i-ST];89 90#pragma omp target91#pragma omp teams92#pragma omp distribute parallel for simd safelen (4)93 for (int i = ST; i < N; i++)94 argv[0][i] = argv[0][i] - argv[0][i-ST];95 96#pragma omp target97#pragma omp teams98#pragma omp distribute parallel for simd safelen (N) // expected-error {{argument to 'safelen' clause must be a strictly positive integer value}}99 for (T i = ST; i < N; i++)100 argv[0][i] = argv[0][i] - argv[0][i-ST];101 102 return argc;103}104 105int main(int argc, char **argv) {106#pragma omp target107#pragma omp teams108#pragma omp parallel for simd safelen // expected-error {{expected '(' after 'safelen'}}109 for (int i = 4; i < 12; i++)110 argv[0][i] = argv[0][i] - argv[0][i-4];111 112#pragma omp target113#pragma omp teams114#pragma omp parallel for simd safelen ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}}115 for (int i = 4; i < 12; i++)116 argv[0][i] = argv[0][i] - argv[0][i-4];117 118#pragma omp target119#pragma omp teams120#pragma omp parallel for simd safelen () // expected-error {{expected expression}}121 for (int i = 4; i < 12; i++)122 argv[0][i] = argv[0][i] - argv[0][i-4];123 124#pragma omp target125#pragma omp teams126#pragma omp parallel for simd safelen (4 // expected-error {{expected ')'}} expected-note {{to match this '('}}127 for (int i = 4; i < 12; i++)128 argv[0][i] = argv[0][i] - argv[0][i-4];129 130#pragma omp target131#pragma omp teams132#pragma omp parallel for simd safelen (2+2)) // expected-warning {{extra tokens at the end of '#pragma omp parallel for simd' are ignored}}133 for (int i = 4; i < 12; i++)134 argv[0][i] = argv[0][i] - argv[0][i-4];135 136 137#pragma omp target138#pragma omp teams139#pragma omp parallel for simd safelen (foobool(1) > 0 ? 1 : 2) // expected-error {{integral constant expression}} expected-note 0+{{constant expression}}140 for (int i = 4; i < 12; i++)141 argv[0][i] = argv[0][i] - argv[0][i-4];142 143#pragma omp target144#pragma omp teams145// expected-error@+3 {{argument to 'safelen' clause must be a strictly positive integer value}}146// expected-error@+2 2 {{directive '#pragma omp parallel for simd' cannot contain more than one 'safelen' clause}}147// expected-error@+1 {{integral constant expression}} expected-note@+1 0+{{constant expression}}148#pragma omp parallel for simd safelen (foobool(argc)), safelen (true), safelen (-5)149 for (int i = 4; i < 12; i++)150 argv[0][i] = argv[0][i] - argv[0][i-4];151 152#pragma omp target153#pragma omp teams154#pragma omp parallel for simd safelen (S1) // expected-error {{'S1' does not refer to a value}}155 for (int i = 4; i < 12; i++)156 argv[0][i] = argv[0][i] - argv[0][i-4];157 158#if __cplusplus <= 199711L159 // expected-error@+6 {{integral constant expression}} expected-note@+6 0+{{constant expression}}160#else161 // expected-error@+4 {{integral constant expression must have integral or unscoped enumeration type, not 'char *'}}162#endif163#pragma omp target164#pragma omp teams165#pragma omp distribute parallel for simd safelen (argv[1]=2) // expected-error {{expected ')'}} expected-note {{to match this '('}}166 for (int i = 4; i < 12; i++)167 argv[0][i] = argv[0][i] - argv[0][i-4];168 169 // expected-note@+3 {{in instantiation of function template specialization 'tmain<int, char, -1, -2>' requested here}}170#pragma omp target171#pragma omp teams172#pragma omp distribute parallel for simd safelen(safelen(tmain<int, char, -1, -2>(argc, argv) // expected-error 2 {{expected ')'}} expected-note 2 {{to match this '('}}173 foo(); // expected-error {{statement after '#pragma omp distribute parallel for simd' must be a for loop}}174 175 // expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, 12, 4>' requested here}}176 return tmain<int, char, 12, 4>(argc, argv);177}178 179