1 // RUN: %clang_cc1 -std=c++11 -verify %s
2 
3 // Note that this puts the expected lines before the directives to work around
4 // limitations in the -verify mode.
5 
6 void test(int *List, int Length) {
7   int i = 0;
8 
9 #pragma clang loop vectorize(enable)
10 #pragma clang loop interleave(enable)
11 #pragma clang loop unroll(full)
12   while (i + 1 < Length) {
13     List[i] = i;
14   }
15 
16 #pragma clang loop vectorize_width(4)
17 #pragma clang loop interleave_count(8)
18 #pragma clang loop unroll_count(16)
19   while (i < Length) {
20     List[i] = i;
21   }
22 
23 #pragma clang loop vectorize(disable)
24 #pragma clang loop interleave(disable)
25 #pragma clang loop unroll(disable)
26   while (i - 1 < Length) {
27     List[i] = i;
28   }
29 
30 #pragma clang loop vectorize_width(4) interleave_count(8) unroll_count(16)
31   while (i - 2 < Length) {
32     List[i] = i;
33   }
34 
35 #pragma clang loop interleave_count(16)
36   while (i - 3 < Length) {
37     List[i] = i;
38   }
39 
40   int VList[Length];
41 #pragma clang loop vectorize(disable) interleave(disable) unroll(disable)
42   for (int j : VList) {
43     VList[j] = List[j];
44   }
45 
46 /* expected-error {{expected '('}} */ #pragma clang loop vectorize
47 /* expected-error {{expected '('}} */ #pragma clang loop interleave
48 /* expected-error {{expected '('}} */ #pragma clang loop unroll
49 
50 /* expected-error {{expected ')'}} */ #pragma clang loop vectorize(enable
51 /* expected-error {{expected ')'}} */ #pragma clang loop interleave(enable
52 /* expected-error {{expected ')'}} */ #pragma clang loop unroll(full
53 
54 /* expected-error {{expected ')'}} */ #pragma clang loop vectorize_width(4
55 /* expected-error {{expected ')'}} */ #pragma clang loop interleave_count(4
56 /* expected-error {{expected ')'}} */ #pragma clang loop unroll_count(4
57 
58 /* expected-error {{missing argument to '#pragma clang loop vectorize'}} */ #pragma clang loop vectorize()
59 /* expected-error {{missing argument to '#pragma clang loop interleave_count'}} */ #pragma clang loop interleave_count()
60 /* expected-error {{missing argument to '#pragma clang loop unroll'}} */ #pragma clang loop unroll()
61 
62 /* expected-error {{missing option}} */ #pragma clang loop
63 /* expected-error {{invalid option 'badkeyword'}} */ #pragma clang loop badkeyword
64 /* expected-error {{invalid option 'badkeyword'}} */ #pragma clang loop badkeyword(enable)
65 /* expected-error {{invalid option 'badkeyword'}} */ #pragma clang loop vectorize(enable) badkeyword(4)
66 /* expected-warning {{extra tokens at end of '#pragma clang loop'}} */ #pragma clang loop vectorize(enable) ,
67 
68   while (i-4 < Length) {
69     List[i] = i;
70   }
71 
72 /* expected-error {{invalid argument; expected a positive integer value}} */ #pragma clang loop vectorize_width(0)
73 /* expected-error {{invalid argument; expected a positive integer value}} */ #pragma clang loop interleave_count(0)
74 /* expected-error {{invalid argument; expected a positive integer value}} */ #pragma clang loop unroll_count(0)
75   while (i-5 < Length) {
76     List[i] = i;
77   }
78 
79 /* expected-error {{invalid argument; expected a positive integer value}} */ #pragma clang loop vectorize_width(3000000000)
80 /* expected-error {{invalid argument; expected a positive integer value}} */ #pragma clang loop interleave_count(3000000000)
81 /* expected-error {{invalid argument; expected a positive integer value}} */ #pragma clang loop unroll_count(3000000000)
82   while (i-6 < Length) {
83     List[i] = i;
84   }
85 
86 /* expected-error {{expected ')'}} */ #pragma clang loop vectorize_width(1 +) 1
87 /* expected-warning {{extra tokens at end of '#pragma clang loop'}} */ #pragma clang loop vectorize_width(1) +1
88 
89 /* expected-error {{invalid argument; expected a positive integer value}} */ #pragma clang loop vectorize_width(badvalue)
90 /* expected-error {{invalid argument; expected a positive integer value}} */ #pragma clang loop interleave_count(badvalue)
91 /* expected-error {{invalid argument; expected a positive integer value}} */ #pragma clang loop unroll_count(badvalue)
92   while (i-6 < Length) {
93     List[i] = i;
94   }
95 
96 /* expected-error {{invalid argument; expected 'enable' or 'disable'}} */ #pragma clang loop vectorize(badidentifier)
97 /* expected-error {{invalid argument; expected 'enable' or 'disable'}} */ #pragma clang loop interleave(badidentifier)
98 /* expected-error {{invalid argument; expected 'full' or 'disable'}} */ #pragma clang loop unroll(badidentifier)
99   while (i-7 < Length) {
100     List[i] = i;
101   }
102 
103 // PR20069 - Loop pragma arguments that are not identifiers or numeric
104 // constants crash FE.
105 /* expected-error {{invalid argument; expected 'enable' or 'disable'}} */ #pragma clang loop vectorize(()
106 /* expected-error {{invalid argument; expected 'enable' or 'disable'}} */ #pragma clang loop interleave(*)
107 /* expected-error {{invalid argument; expected 'full' or 'disable'}} */ #pragma clang loop unroll(=)
108 /* expected-error {{invalid argument; expected a positive integer value}} */ #pragma clang loop vectorize_width(^)
109 /* expected-error {{invalid argument; expected a positive integer value}} */ #pragma clang loop interleave_count(/)
110 /* expected-error {{invalid argument; expected a positive integer value}} */ #pragma clang loop unroll_count(==)
111   while (i-8 < Length) {
112     List[i] = i;
113   }
114 
115 #pragma clang loop vectorize(enable)
116 /* expected-error {{expected a for, while, or do-while loop to follow '#pragma clang loop'}} */ int j = Length;
117   List[0] = List[1];
118 
119   while (j-1 < Length) {
120     List[j] = j;
121   }
122 
123 // FIXME: A bug in ParsedAttributes causes the order of the attributes to be
124 // processed in reverse. Consequently, the errors occur on the first of pragma
125 // of the next three tests rather than the last, and the order of the kinds
126 // is also reversed.
127 
128 /* expected-error {{incompatible directives 'vectorize(disable)' and 'vectorize_width(4)'}} */ #pragma clang loop vectorize_width(4)
129 #pragma clang loop vectorize(disable)
130 /* expected-error {{incompatible directives 'interleave(disable)' and 'interleave_count(4)'}} */ #pragma clang loop interleave_count(4)
131 #pragma clang loop interleave(disable)
132 /* expected-error {{incompatible directives 'unroll(disable)' and 'unroll_count(4)'}} */ #pragma clang loop unroll_count(4)
133 #pragma clang loop unroll(disable)
134   while (i-8 < Length) {
135     List[i] = i;
136   }
137 
138 /* expected-error {{duplicate directives 'vectorize(disable)' and 'vectorize(enable)'}} */ #pragma clang loop vectorize(enable)
139 #pragma clang loop vectorize(disable)
140 /* expected-error {{duplicate directives 'interleave(disable)' and 'interleave(enable)'}} */ #pragma clang loop interleave(enable)
141 #pragma clang loop interleave(disable)
142 /* expected-error {{duplicate directives 'unroll(disable)' and 'unroll(full)'}} */ #pragma clang loop unroll(full)
143 #pragma clang loop unroll(disable)
144   while (i-9 < Length) {
145     List[i] = i;
146   }
147 
148 /* expected-error {{incompatible directives 'vectorize(disable)' and 'vectorize_width(4)'}} */ #pragma clang loop vectorize(disable)
149 #pragma clang loop vectorize_width(4)
150 /* expected-error {{incompatible directives 'interleave(disable)' and 'interleave_count(4)'}} */ #pragma clang loop interleave(disable)
151 #pragma clang loop interleave_count(4)
152 /* expected-error {{incompatible directives 'unroll(disable)' and 'unroll_count(4)'}} */ #pragma clang loop unroll(disable)
153 #pragma clang loop unroll_count(4)
154   while (i-10 < Length) {
155     List[i] = i;
156   }
157 
158 /* expected-error {{duplicate directives 'vectorize_width(4)' and 'vectorize_width(8)'}} */ #pragma clang loop vectorize_width(8)
159 #pragma clang loop vectorize_width(4)
160 /* expected-error {{duplicate directives 'interleave_count(4)' and 'interleave_count(8)'}} */ #pragma clang loop interleave_count(8)
161 #pragma clang loop interleave_count(4)
162 /* expected-error {{duplicate directives 'unroll_count(4)' and 'unroll_count(8)'}} */ #pragma clang loop unroll_count(8)
163 #pragma clang loop unroll_count(4)
164   while (i-11 < Length) {
165     List[i] = i;
166   }
167 
168 
169 /* expected-error {{incompatible directives 'unroll(full)' and 'unroll_count(4)'}} */ #pragma clang loop unroll(full)
170 #pragma clang loop unroll_count(4)
171   while (i-11 < Length) {
172     List[i] = i;
173   }
174 
175 #pragma clang loop interleave(enable)
176 /* expected-error {{expected statement}} */ }
177