e5b3a1d44a1054d2787b7771aae0681be8c206b9
[lldb.git] / clang-tools-extra / test / loop-convert / loop-convert-negative-pseudoarray.cpp
1 // RUN: rm -rf %t.cpp
2 // RUN: grep -Ev "//\s*[A-Z-]+:" %s > %t.cpp
3 // RUN: loop-convert -A1 . %t.cpp -- -I %S/Inputs \
4 // RUN:         && FileCheck -input-file=%t.cpp %s
5
6 #include "structures.h"
7
8 // Single FileCheck line to make sure that no loops are converted.
9 // CHECK-NOT: for ({{.*[^:]:[^:].*}})
10
11 const int N = 6;
12 dependent<int> v;
13 dependent<int> *pv;
14
15 transparent<dependent<int> > cv;
16 int sum = 0;
17
18 // Checks for the index start and end:
19 void indexStartAndEnd() {
20   for (int i = 0; i < v.size() + 1; ++i)
21     sum += v[i];
22
23   for (int i = 0; i < v.size() - 1; ++i)
24     sum += v[i];
25
26   for (int i = 1; i < v.size(); ++i)
27     sum += v[i];
28
29   for (int i = 1; i < v.size(); ++i)
30     sum += v[i];
31
32   for (int i = 0; ; ++i)
33     sum += (*pv)[i];
34 }
35
36 // Checks for invalid increment steps:
37 void increment() {
38   for (int i = 0; i < v.size(); --i)
39     sum += v[i];
40
41   for (int i = 0; i < v.size(); i)
42     sum += v[i];
43
44   for (int i = 0; i < v.size();)
45     sum += v[i];
46
47   for (int i = 0; i < v.size(); i += 2)
48     sum ++;
49 }
50
51 // Checks to make sure that the index isn't used outside of the container:
52 void indexUse() {
53   for (int i = 0; i < v.size(); ++i)
54     v[i] += 1 + i;
55 }
56
57 // Checks for incorrect loop variables.
58 void mixedVariables() {
59   int badIndex;
60   for (int i = 0; badIndex < v.size(); ++i)
61     sum += v[i];
62
63   for (int i = 0; i < v.size(); ++badIndex)
64     sum += v[i];
65
66   for (int i = 0; badIndex < v.size(); ++badIndex)
67     sum += v[i];
68
69   for (int i = 0; badIndex < v.size(); ++badIndex)
70     sum += v[badIndex];
71 }
72
73 // Checks for an array indexed in addition to the container.
74 void multipleArrays() {
75   int badArr[N];
76
77   for (int i = 0; i < v.size(); ++i)
78     sum += v[i] + badArr[i];
79
80   for (int i = 0; i < v.size(); ++i)
81     sum += badArr[i];
82
83   for (int i = 0; i < v.size(); ++i) {
84     int k = badArr[i];
85     sum += k + 2;
86   }
87
88   for (int i = 0; i < v.size(); ++i) {
89     int k = badArr[i];
90     sum += v[i] + k;
91   }
92 }
93
94 // Checks for multiple containers being indexed container.
95 void multipleContainers() {
96   dependent<int> badArr;
97
98   for (int i = 0; i < v.size(); ++i)
99     sum += v[i] + badArr[i];
100
101   for (int i = 0; i < v.size(); ++i)
102     sum += badArr[i];
103
104   for (int i = 0; i < v.size(); ++i) {
105     int k = badArr[i];
106     sum += k + 2;
107   }
108
109   for (int i = 0; i < v.size(); ++i) {
110     int k = badArr[i];
111     sum += v[i] + k;
112   }
113 }
114
115 // Check to make sure that dereferenced pointers-to-containers behave nicely
116 void derefContainer() {
117   // Note the dependent<T>::operator*() returns another dependent<T>.
118   // This test makes sure that we don't allow an arbitrary number of *'s.
119   for (int i = 0; i < pv->size(); ++i)
120     sum += (**pv).at(i);
121
122   for (int i = 0; i < pv->size(); ++i)
123     sum += (**pv)[i];
124 }
125
126 void wrongEnd() {
127   int bad;
128   for (int i = 0, e = v.size(); i < bad; ++i)
129     sum += v[i];
130 }