For Loop Conversion
[lldb.git] / clang-tools-extra / test / loop-convert / loop-convert-nesting.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
6 #include "structures.h"
7
8 void f() {
9   const int N = 10;
10   const int M = 15;
11   Val Arr[N];
12   for (int i = 0; i < N; ++i) {
13     for (int j = 0; j < N; ++j) {
14       int k = Arr[i].x + Arr[j].x;
15       // The repeat is there to allow FileCheck to make sure the two variable
16       // names aren't the same.
17       int l = Arr[i].x + Arr[j].x;
18     }
19   }
20   // CHECK: for (auto & [[VAR:[a-zA-Z_]+]] : Arr)
21   // CHECK-NEXT: for (auto & [[INNERVAR:[a-zA-Z_]+]] : Arr)
22   // CHECK-NEXT: int k = [[VAR]].x + [[INNERVAR]].x;
23   // CHECK-NOT: int l = [[VAR]].x + [[VAR]].x;
24
25   Val Nest[N][M];
26   for (int i = 0; i < N; ++i) {
27     for (int j = 0; j < M; ++j) {
28       printf("Got item %d", Nest[i][j].x);
29     }
30   }
31   // The inner loop is also convertible, but doesn't need to be converted
32   // immediately. Update this test when that changes!
33   // CHECK: for (auto & [[VAR:[a-zA-Z_]+]] : Nest)
34   // CHECK-NEXT: for (int j = 0; j < M; ++j)
35   // CHECK-NEXT: printf("Got item %d", [[VAR]][j].x);
36
37   // Note that the order of M and N are switched for this test.
38   for (int j = 0; j < M; ++j) {
39     for (int i = 0; i < N; ++i) {
40       printf("Got item %d", Nest[i][j].x);
41     }
42   }
43   // CHECK-NOT: for (auto & {{[a-zA-Z_]+}} : Nest[i])
44   // CHECK: for (int j = 0; j < M; ++j)
45   // CHECK-NEXT: for (auto & [[VAR:[a-zA-Z_]+]] : Nest)
46   // CHECK-NEXT: printf("Got item %d", [[VAR]][j].x);
47   Nested<T> NestT;
48   for (Nested<T>::iterator I = NestT.begin(), E = NestT.end(); I != E; ++I) {
49     for (T::iterator TI = (*I).begin(), TE = (*I).end(); TI != TE; ++TI) {
50       printf("%d", *TI);
51     }
52   }
53   // The inner loop is also convertible, but doesn't need to be converted
54   // immediately. Update this test when that changes!
55   // CHECK: for (auto & [[VAR:[a-zA-Z_]+]] : NestT) {
56   // CHECK-NEXT: for (T::iterator TI = ([[VAR]]).begin(), TE = ([[VAR]]).end(); TI != TE; ++TI) {
57   // CHECK-NEXT: printf("%d", *TI);
58 }