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