1*6c050052SMichael Kruse // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -std=c++17 -fopenmp -fopenmp-version=51 -fsyntax-only -Wuninitialized -verify %s
2*6c050052SMichael Kruse 
func()3*6c050052SMichael Kruse void func() {
4*6c050052SMichael Kruse 
5*6c050052SMichael Kruse   // expected-error@+1 {{expected '('}}
6*6c050052SMichael Kruse   #pragma omp tile sizes
7*6c050052SMichael Kruse     ;
8*6c050052SMichael Kruse 
9*6c050052SMichael Kruse   // expected-error@+2 {{expected expression}}
10*6c050052SMichael Kruse   // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
11*6c050052SMichael Kruse   #pragma omp tile  sizes(
12*6c050052SMichael Kruse     ;
13*6c050052SMichael Kruse 
14*6c050052SMichael Kruse   // expected-error@+1 {{expected expression}}
15*6c050052SMichael Kruse   #pragma omp tile sizes()
16*6c050052SMichael Kruse     ;
17*6c050052SMichael Kruse 
18*6c050052SMichael Kruse   // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
19*6c050052SMichael Kruse   #pragma omp tile sizes(5
20*6c050052SMichael Kruse     for (int i = 0; i < 7; ++i);
21*6c050052SMichael Kruse 
22*6c050052SMichael Kruse   // expected-error@+2 {{expected expression}}
23*6c050052SMichael Kruse   // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
24*6c050052SMichael Kruse   #pragma omp tile sizes(5,
25*6c050052SMichael Kruse     ;
26*6c050052SMichael Kruse 
27*6c050052SMichael Kruse   // expected-error@+1 {{expected expression}}
28*6c050052SMichael Kruse   #pragma omp tile sizes(5,)
29*6c050052SMichael Kruse     ;
30*6c050052SMichael Kruse 
31*6c050052SMichael Kruse   // expected-error@+2 {{expected expression}}
32*6c050052SMichael Kruse   // expected-error@+1 {{expected ')'}} expected-note@+1 {{to match this '('}}
33*6c050052SMichael Kruse   #pragma omp tile sizes(5+
34*6c050052SMichael Kruse     ;
35*6c050052SMichael Kruse 
36*6c050052SMichael Kruse   // expected-error@+1 {{expected expression}}
37*6c050052SMichael Kruse   #pragma omp tile sizes(5+)
38*6c050052SMichael Kruse     ;
39*6c050052SMichael Kruse 
40*6c050052SMichael Kruse   // expected-error@+1 {{expected expression}}
41*6c050052SMichael Kruse   #pragma omp tile sizes(for)
42*6c050052SMichael Kruse     ;
43*6c050052SMichael Kruse 
44*6c050052SMichael Kruse   // expected-error@+1 {{argument to 'sizes' clause must be a strictly positive integer value}}
45*6c050052SMichael Kruse   #pragma omp tile sizes(0)
46*6c050052SMichael Kruse     ;
47*6c050052SMichael Kruse 
48*6c050052SMichael Kruse   // expected-error@+4 {{expression is not an integral constant expression}}
49*6c050052SMichael Kruse   // expected-note@+3 {{read of non-const variable 'a' is not allowed in a constant expression}}
50*6c050052SMichael Kruse   // expected-note@+1 {{declared here}}
51*6c050052SMichael Kruse   int a;
52*6c050052SMichael Kruse   #pragma omp tile sizes(a)
53*6c050052SMichael Kruse     ;
54*6c050052SMichael Kruse 
55*6c050052SMichael Kruse   // expected-warning@+2 {{extra tokens at the end of '#pragma omp tile' are ignored}}
56*6c050052SMichael Kruse   // expected-error@+1 {{directive '#pragma omp tile' requires the 'sizes' clause}}
57*6c050052SMichael Kruse   #pragma omp tile foo
58*6c050052SMichael Kruse     ;
59*6c050052SMichael Kruse 
60*6c050052SMichael Kruse   // expected-error@+1 {{directive '#pragma omp tile' cannot contain more than one 'sizes' clause}}
61*6c050052SMichael Kruse   #pragma omp tile sizes(5) sizes(5)
62*6c050052SMichael Kruse   for (int i = 0; i < 7; ++i)
63*6c050052SMichael Kruse     ;
64*6c050052SMichael Kruse 
65*6c050052SMichael Kruse   // expected-error@+1 {{unexpected OpenMP clause 'collapse' in directive '#pragma omp tile'}}
66*6c050052SMichael Kruse   #pragma omp tile sizes(5) collapse(2)
67*6c050052SMichael Kruse   for (int i = 0; i < 7; ++i)
68*6c050052SMichael Kruse     ;
69*6c050052SMichael Kruse 
70*6c050052SMichael Kruse   {
71*6c050052SMichael Kruse     // expected-error@+2 {{expected statement}}
72*6c050052SMichael Kruse     #pragma omp tile sizes(5)
73*6c050052SMichael Kruse   }
74*6c050052SMichael Kruse 
75*6c050052SMichael Kruse   // expected-error@+2 {{statement after '#pragma omp tile' must be a for loop}}
76*6c050052SMichael Kruse   #pragma omp tile sizes(5)
77*6c050052SMichael Kruse   int b = 0;
78*6c050052SMichael Kruse 
79*6c050052SMichael Kruse   // expected-error@+3 {{statement after '#pragma omp tile' must be a for loop}}
80*6c050052SMichael Kruse   #pragma omp tile sizes(5,5)
81*6c050052SMichael Kruse   for (int i = 0; i < 7; ++i)
82*6c050052SMichael Kruse     ;
83*6c050052SMichael Kruse 
84*6c050052SMichael Kruse   // expected-error@+2 {{statement after '#pragma omp tile' must be a for loop}}
85*6c050052SMichael Kruse   #pragma omp tile sizes(5,5)
86*6c050052SMichael Kruse   for (int i = 0; i < 7; ++i) {
87*6c050052SMichael Kruse     int k = 3;
88*6c050052SMichael Kruse     for (int j = 0; j < 7; ++j)
89*6c050052SMichael Kruse       ;
90*6c050052SMichael Kruse   }
91*6c050052SMichael Kruse 
92*6c050052SMichael Kruse   // expected-error@+3 {{expected loop invariant expression}}
93*6c050052SMichael Kruse   #pragma omp tile sizes(5,5)
94*6c050052SMichael Kruse   for (int i = 0; i < 7; ++i)
95*6c050052SMichael Kruse     for (int j = i; j < 7; ++j)
96*6c050052SMichael Kruse       ;
97*6c050052SMichael Kruse 
98*6c050052SMichael Kruse   // expected-error@+3 {{expected loop invariant expression}}
99*6c050052SMichael Kruse   #pragma omp tile sizes(5,5)
100*6c050052SMichael Kruse   for (int i = 0; i < 7; ++i)
101*6c050052SMichael Kruse     for (int j = 0; j < i; ++j)
102*6c050052SMichael Kruse       ;
103*6c050052SMichael Kruse 
104*6c050052SMichael Kruse   // expected-error@+3 {{expected loop invariant expression}}
105*6c050052SMichael Kruse   #pragma omp tile sizes(5,5)
106*6c050052SMichael Kruse   for (int i = 0; i < 7; ++i)
107*6c050052SMichael Kruse     for (int j = 0; j < i; ++j)
108*6c050052SMichael Kruse       ;
109*6c050052SMichael Kruse 
110*6c050052SMichael Kruse   // expected-error@+5 {{expected 3 for loops after '#pragma omp for', but found only 2}}
111*6c050052SMichael Kruse   // expected-note@+1 {{as specified in 'collapse' clause}}
112*6c050052SMichael Kruse   #pragma omp for collapse(3)
113*6c050052SMichael Kruse   #pragma omp tile sizes(5)
114*6c050052SMichael Kruse   for (int i = 0; i < 7; ++i)
115*6c050052SMichael Kruse     ;
116*6c050052SMichael Kruse 
117*6c050052SMichael Kruse   // expected-error@+2 {{statement after '#pragma omp tile' must be a for loop}}
118*6c050052SMichael Kruse   #pragma omp tile sizes(5)
119*6c050052SMichael Kruse   #pragma omp for
120*6c050052SMichael Kruse   for (int i = 0; i < 7; ++i)
121*6c050052SMichael Kruse     ;
122*6c050052SMichael Kruse 
123*6c050052SMichael Kruse   // expected-error@+2 {{condition of OpenMP for loop must be a relational comparison ('<', '<=', '>', '>=', or '!=') of loop variable 'i'}}
124*6c050052SMichael Kruse   #pragma omp tile sizes(5)
125*6c050052SMichael Kruse   for (int i = 0; i/3<7; ++i)
126*6c050052SMichael Kruse     ;
127*6c050052SMichael Kruse }
128