For Loop Conversion
[lldb.git] / clang-tools-extra / test / loop-convert / loop-convert-array.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: cp %t.cpp %t.base
7 // RUN: loop-convert -count-only . %t.cpp -- -I %S/Inputs > %T/out \
8 // RUN:         && FileCheck -check-prefix=COUNTONLY -input-file=%T/out %s \
9 // RUN:         && diff %t.cpp %t.base
10
11 const int N = 6;
12 const int NMinusOne = N - 1;
13 int arr[N] = {1, 2, 3, 4, 5, 6};
14 int (*pArr)[N] = &arr;
15 #include "structures.h"
16 void f() {
17   int sum = 0;
18   // Update the number of correctly converted loops as this test changes:
19   // COUNTONLY: 14 converted
20   // COUNTONLY-NEXT: 0 potentially conflicting
21   // COUNTONLY-NEXT: 0 change(s) rejected
22
23   for (int i = 0; i < N; ++i) {
24     sum += arr[i];
25     int k;
26   }
27   // CHECK: for (auto & [[VAR:[a-z_]+]] : arr) {
28   // CHECK-NEXT: sum += [[VAR]];
29   // CHECK-NEXT: int k;
30   // CHECK-NEXT: }
31
32   for (int i = 0; i < N; ++i) {
33     printf("Fibonacci number is %d\n", arr[i]);
34     sum += arr[i] + 2;
35   }
36   // CHECK: for (auto & [[VAR:[a-z_]+]] : arr)
37   // CHECK-NEXT: printf("Fibonacci number is %d\n", [[VAR]]);
38   // CHECK-NEXT: sum += [[VAR]] + 2;
39
40   for (int i = 0; i < N; ++i) {
41     int x = arr[i];
42     int y = arr[i] + 2;
43   }
44   // CHECK: for (auto & [[VAR:[a-z_]+]] : arr)
45   // CHECK-NEXT: int x = [[VAR]];
46   // CHECK-NEXT: int y = [[VAR]] + 2;
47
48   for (int i = 0; i < N; ++i) {
49     int x = N;
50     x = arr[i];
51   }
52   // CHECK: for (auto & [[VAR:[a-z_]+]] : arr)
53   // CHECK-NEXT: int x = N;
54   // CHECK-NEXT: x = [[VAR]];
55
56   for (int i = 0; i < N; ++i) {
57     arr[i] += 1;
58   }
59   // CHECK: for (auto & [[VAR:[a-z_]+]] : arr) {
60   // CHECK-NEXT: [[VAR]] += 1;
61   // CHECK-NEXT: }
62
63   for (int i = 0; i < N; ++i) {
64     int x = arr[i] + 2;
65     arr[i] ++;
66   }
67   // CHECK: for (auto & [[VAR:[a-z_]+]] : arr)
68   // CHECK-NEXT: int x = [[VAR]] + 2;
69   // CHECK-NEXT: [[VAR]] ++;
70
71   for (int i = 0; i < N; ++i) {
72     arr[i] = 4 + arr[i];
73   }
74   // CHECK: for (auto & [[VAR:[a-z_]+]] : arr)
75   // CHECK-NEXT: [[VAR]] = 4 + [[VAR]];
76
77   for (int i = 0; i < NMinusOne + 1; ++i) {
78     sum += arr[i];
79   }
80   // CHECK: for (auto & [[VAR:[a-z_]+]] : arr) {
81   // CHECK-NEXT: sum += [[VAR]];
82   // CHECK-NEXT: }
83
84   for (int i = 0; i < N; ++i) {
85     printf("Fibonacci number %d has address %p\n", arr[i], &arr[i]);
86     sum += arr[i] + 2;
87   }
88   // CHECK: for (auto & [[VAR:[a-z_]+]] : arr)
89   // CHECK-NEXT: printf("Fibonacci number %d has address %p\n", [[VAR]], &[[VAR]]);
90   // CHECK-NEXT: sum += [[VAR]] + 2;
91
92   Val teas[N];
93   for (int i = 0; i < N; ++i) {
94     teas[i].g();
95   }
96   // CHECK: for (auto & [[VAR:[a-z_]+]] : teas) {
97   // CHECK-NEXT: [[VAR]].g();
98   // CHECK-NEXT: }
99 }
100
101 struct HasArr {
102   int Arr[N];
103   Val ValArr[N];
104   void implicitThis() {
105     for (int i = 0; i < N; ++i) {
106       printf("%d", Arr[i]);
107     }
108     // CHECK: for (auto & [[VAR:[a-z_]+]] : Arr) {
109     // CHECK-NEXT: printf("%d", [[VAR]]);
110     // CHECK-NEXT: }
111
112     for (int i = 0; i < N; ++i) {
113       printf("%d", ValArr[i].x);
114     }
115     // CHECK: for (auto & [[VAR:[a-z_]+]] : ValArr) {
116     // CHECK-NEXT: printf("%d", [[VAR]].x);
117     // CHECK-NEXT: }
118   }
119
120   void explicitThis() {
121     for (int i = 0; i < N; ++i) {
122       printf("%d", this->Arr[i]);
123     }
124     // CHECK: for (auto & [[VAR:[a-z_]+]] : this->Arr) {
125     // CHECK-NEXT: printf("%d", [[VAR]]);
126     // CHECK-NEXT: }
127
128     for (int i = 0; i < N; ++i) {
129       printf("%d", this->ValArr[i].x);
130     }
131     // CHECK: for (auto & [[VAR:[a-z_]+]] : this->ValArr) {
132     // CHECK-NEXT: printf("%d", [[VAR]].x);
133     // CHECK-NEXT: }
134   }
135 };