1176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// RUN: %clang_cc1 -std=c++11 -verify %s
2176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
3176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Note that this puts the expected lines before the directives to work around
4176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// limitations in the -verify mode.
5176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
6176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid test(int *List, int Length) {
7176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  int i = 0;
8176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
9176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma unroll
10176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (i + 1 < Length) {
11176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    List[i] = i;
12176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
13176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
14176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma nounroll
15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (i < Length) {
16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    List[i] = i;
17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
18176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
19176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma unroll 4
20176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (i - 1 < Length) {
21176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    List[i] = i;
22176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
23176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
24176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma unroll(8)
25176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (i - 2 < Length) {
26176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    List[i] = i;
27176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
28176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
29176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{expected ')'}} */ #pragma unroll(4
30176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{missing argument; expected an integer value}} */ #pragma unroll()
31176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-warning {{extra tokens at end of '#pragma unroll'}} */ #pragma unroll 1 2
32176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (i-6 < Length) {
33176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    List[i] = i;
34176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
35176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
36176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-warning {{extra tokens at end of '#pragma nounroll'}} */ #pragma nounroll 1
37176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (i-7 < Length) {
38176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    List[i] = i;
39176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
40176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
41176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{expected ')'}} */ #pragma unroll(()
42176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{expected expression}} */ #pragma unroll -
43176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{invalid value '0'; must be positive}} */ #pragma unroll(0)
44176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{invalid value '0'; must be positive}} */ #pragma unroll 0
45176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{value '3000000000' is too large}} */ #pragma unroll(3000000000)
46176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{value '3000000000' is too large}} */ #pragma unroll 3000000000
47176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (i-8 < Length) {
48176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    List[i] = i;
49176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
50176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
51176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma unroll
52176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{expected a for, while, or do-while loop to follow '#pragma unroll'}} */ int j = Length;
53176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma unroll 4
54176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{expected a for, while, or do-while loop to follow '#pragma unroll'}} */ int k = Length;
55176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma nounroll
56176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{expected a for, while, or do-while loop to follow '#pragma nounroll'}} */ int l = Length;
57176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
58176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{incompatible directives 'unroll(disable)' and '#pragma unroll(4)'}} */ #pragma unroll 4
59176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma clang loop unroll(disable)
60176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (i-10 < Length) {
61176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    List[i] = i;
62176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
63176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
64176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{incompatible directives 'unroll(full)' and '#pragma unroll(4)'}} */ #pragma unroll(4)
65176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma clang loop unroll(full)
66176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (i-11 < Length) {
67176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    List[i] = i;
68176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
69176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
7087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar/* expected-error {{incompatible directives 'unroll(enable)' and '#pragma unroll(4)'}} */ #pragma unroll(4)
7187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar#pragma clang loop unroll(enable)
7287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  while (i-11 < Length) {
7387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar    List[i] = i;
7487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar  }
7587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar
76176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{incompatible directives '#pragma unroll' and '#pragma unroll(4)'}} */ #pragma unroll(4)
77176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma unroll
78176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (i-11 < Length) {
79176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    List[i] = i;
80176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
81176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
82176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{incompatible directives '#pragma nounroll' and 'unroll_count(4)'}} */ #pragma clang loop unroll_count(4)
83176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma nounroll
84176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (i-12 < Length) {
85176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    List[i] = i;
86176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
87176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
88176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{duplicate directives '#pragma nounroll' and '#pragma nounroll'}} */ #pragma nounroll
89176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma nounroll
90176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (i-13 < Length) {
91176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    List[i] = i;
92176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
93176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
94176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{duplicate directives '#pragma unroll' and '#pragma unroll'}} */ #pragma unroll
95176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma unroll
96176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (i-14 < Length) {
97176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    List[i] = i;
98176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
99176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
100176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{duplicate directives 'unroll(full)' and '#pragma unroll'}} */ #pragma unroll
101176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma clang loop unroll(full)
102176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (i-15 < Length) {
103176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    List[i] = i;
104176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
105176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
106176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{duplicate directives '#pragma unroll(4)' and '#pragma unroll(4)'}} */ #pragma unroll 4
107176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma unroll(4)
108176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  while (i-16 < Length) {
109176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines    List[i] = i;
110176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines  }
111176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines
112176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#pragma unroll
113176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines/* expected-error {{expected statement}} */ }
114