For Loop Conversion
[lldb.git] / clang-tools-extra / test / loop-convert / loop-convert-iterator.cpp
1 // RUN: rm -rf %t.cpp
2 // RUN: grep -Ev "//\s*[A-Z-]+:" %s > %t.cpp
3 // RUN: loop-convert . %t.cpp -- -I %S/Inputs \
4 // RUN:           && FileCheck -input-file=%t.cpp %s
5 // RUN: grep -Ev "//\s*[A-Z-]+:" %s > %t.cpp
6 // RUN: rm -rf %t.cpp
7
8 #include "structures.h"
9
10 void f() {
11   /// begin()/end() - based for loops here:
12   T t;
13   for (T::iterator it = t.begin(), e = t.end(); it != e; ++it) {
14     printf("I found %d\n", *it);
15   }
16   // CHECK: for ({{[a-zA-Z_ ]+&? ?}}[[VAR:[a-z_]+]] : t)
17   // CHECK-NEXT: printf("I found %d\n", [[VAR]]);
18
19   T *pt;
20   for (T::iterator it = pt->begin(), e = pt->end(); it != e; ++it) {
21     printf("I found %d\n", *it);
22   }
23   // CHECK: for ({{[a-zA-Z_ ]+&? ?}}[[VAR:[a-z_]+]] : *pt)
24   // CHECK-NEXT: printf("I found %d\n", [[VAR]]);
25
26   S s;
27   for (S::const_iterator it = s.begin(), e = s.end(); it != e; ++it) {
28     printf("s has value %d\n", (*it).x);
29   }
30   // CHECK: for ({{[a-zA-Z_ ]*&? ?}}[[VAR:[a-z_]+]] : s)
31   // CHECK-NEXT: printf("s has value %d\n", ([[VAR]]).x);
32
33   S *ps;
34   for (S::const_iterator it = ps->begin(), e = ps->end(); it != e; ++it) {
35     printf("s has value %d\n", (*it).x);
36   }
37   // CHECK: for ({{[a-zA-Z_ ]*&? ?}}[[VAR:[a-z_]+]] : *ps)
38   // CHECK-NEXT: printf("s has value %d\n", ([[VAR]]).x);
39
40   for (S::const_iterator it = s.begin(), e = s.end(); it != e; ++it) {
41     printf("s has value %d\n", it->x);
42   }
43   // CHECK: for ({{[a-zA-Z_ ]*&? ?}}[[VAR:[a-z_]+]] : s)
44   // CHECK-NEXT: printf("s has value %d\n", [[VAR]].x);
45
46   for (S::iterator it = s.begin(), e = s.end(); it != e; ++it) {
47     it->x = 3;
48   }
49   // CHECK: for ({{[a-zA-Z_ ]*&? ?}}[[VAR:[a-z_]+]] : s)
50   // CHECK-NEXT: [[VAR]].x = 3;
51
52   for (S::iterator it = s.begin(), e = s.end(); it != e; ++it) {
53     (*it).x = 3;
54   }
55   // CHECK: for ({{[a-zA-Z_ ]*&? ?}}[[VAR:[a-z_]+]] : s)
56   // CHECK-NEXT: ([[VAR]]).x = 3;
57
58   for (S::iterator it = s.begin(), e = s.end(); it != e; ++it) {
59     it->nonConstFun(4, 5);
60   }
61   // CHECK: for ({{[a-zA-Z_ ]*&? ?}}[[VAR:[a-z_]+]] : s)
62   // CHECK-NEXT: [[VAR]].nonConstFun(4, 5);
63
64   U u;
65   for (U::iterator it = u.begin(), e = u.end(); it != e; ++it) {
66     printf("s has value %d\n", it->x);
67   }
68   // CHECK: for ({{[a-zA-Z_ ]*&? ?}}[[VAR:[a-z_]+]] : u)
69   // CHECK-NEXT: printf("s has value %d\n", [[VAR]].x);
70
71   for (U::iterator it = u.begin(), e = u.end(); it != e; ++it) {
72     printf("s has value %d\n", (*it).x);
73   }
74   // CHECK: for ({{[a-zA-Z_ ]*&? ?}}[[VAR:[a-z_]+]] : u)
75   // CHECK-NEXT: printf("s has value %d\n", ([[VAR]]).x);
76
77   U::iterator A;
78   for (U::iterator i = u.begin(), e = u.end(); i != e; ++i)
79     int k = A->x + i->x;
80   // CHECK: for ({{[a-zA-Z_ ]*&? ?}}[[VAR:[a-z_]+]] : u)
81   // CHECK-NEXT: int k = A->x + [[VAR]].x;
82
83   dependent<int> v;
84   for (dependent<int>::const_iterator it = v.begin(), e = v.end();
85        it != e; ++it) {
86     printf("Fibonacci number is %d\n", *it);
87   }
88   // CHECK: for ({{[a-zA-Z_ ]*&? ?}}[[VAR:[a-z_]+]] : v)
89   // CHECK-NEXT: printf("Fibonacci number is %d\n", [[VAR]]);
90
91   for (dependent<int>::const_iterator it(v.begin()), e = v.end();
92        it != e; ++it) {
93     printf("Fibonacci number is %d\n", *it);
94   }
95   // CHECK: for ({{[a-zA-Z_ ]*&? ?}}[[VAR:[a-z_]+]] : v)
96   // CHECK-NEXT: printf("Fibonacci number is %d\n", [[VAR]]);
97
98   doublyDependent<int,int> intmap;
99   for (doublyDependent<int,int>::iterator it = intmap.begin(), e = intmap.end();
100        it != e; ++it) {
101     printf("intmap[%d] = %d", it->first, it->second);
102   }
103   // CHECK: for ({{[a-zA-Z_ ]*&? ?}}[[VAR:[a-z_]+]] : intmap)
104   // CHECK-NEXT: printf("intmap[%d] = %d", [[VAR]].first, [[VAR]].second);
105
106 }