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