// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp // RUN: clang-modernize -loop-convert %t.cpp -- -I %S/Inputs // RUN: FileCheck -input-file=%t.cpp %s #include "structures.h" void f() { const int N = 10; const int M = 15; Val Arr[N]; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { int k = Arr[i].x + Arr[j].x; // The repeat is there to allow FileCheck to make sure the two variable // names aren't the same. int l = Arr[i].x + Arr[j].x; } } // CHECK: for (auto & elem : Arr) // CHECK-NEXT: for (auto & Arr_j : Arr) // CHECK-NEXT: int k = elem.x + Arr_j.x; // CHECK-NOT: int l = elem.x + elem.x; Val Nest[N][M]; for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { printf("Got item %d", Nest[i][j].x); } } // The inner loop is also convertible, but doesn't need to be converted // immediately. Update this test when that changes! // CHECK: for (auto & elem : Nest) // CHECK-NEXT: for (int j = 0; j < M; ++j) // CHECK-NEXT: printf("Got item %d", elem[j].x); // Note that the order of M and N are switched for this test. for (int j = 0; j < M; ++j) { for (int i = 0; i < N; ++i) { printf("Got item %d", Nest[i][j].x); } } // CHECK-NOT: for (auto & {{[a-zA-Z_]+}} : Nest[i]) // CHECK: for (int j = 0; j < M; ++j) // CHECK-NEXT: for (auto & elem : Nest) // CHECK-NEXT: printf("Got item %d", elem[j].x); Nested NestT; for (Nested::iterator I = NestT.begin(), E = NestT.end(); I != E; ++I) { for (T::iterator TI = (*I).begin(), TE = (*I).end(); TI != TE; ++TI) { printf("%d", *TI); } } // The inner loop is also convertible, but doesn't need to be converted // immediately. Update this test when that changes! // CHECK: for (auto & elem : NestT) { // CHECK-NEXT: for (T::iterator TI = (elem).begin(), TE = (elem).end(); TI != TE; ++TI) { // CHECK-NEXT: printf("%d", *TI); Nested NestS; for (Nested::const_iterator I = NestS.begin(), E = NestS.end(); I != E; ++I) { for (S::const_iterator SI = (*I).begin(), SE = (*I).end(); SI != SE; ++SI) { printf("%d", *SI); } } // The inner loop is also convertible, but doesn't need to be converted // immediately. Update this test when that changes! // CHECK: for (const auto & elem : NestS) { // CHECK-NEXT: for (S::const_iterator SI = (elem).begin(), SE = (elem).end(); SI != SE; ++SI) { // CHECK-NEXT: printf("%d", *SI); }