2015-10-22 19:31:44 +08:00
|
|
|
// RUN: %check_clang_tidy %s modernize-loop-convert %t -- -std=c++11 -I %S/Inputs/modernize-loop-convert
|
2015-08-19 17:11:46 +08:00
|
|
|
|
|
|
|
#include "structures.h"
|
|
|
|
|
|
|
|
namespace Array {
|
|
|
|
|
|
|
|
const int N = 6;
|
|
|
|
const int NMinusOne = N - 1;
|
2015-09-25 01:02:19 +08:00
|
|
|
int Arr[N] = {1, 2, 3, 4, 5, 6};
|
|
|
|
const int ConstArr[N] = {1, 2, 3, 4, 5, 6};
|
|
|
|
int (*PArr)[N] = &Arr;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
|
|
|
void f() {
|
2015-09-25 01:02:19 +08:00
|
|
|
int Sum = 0;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < N; ++I) {
|
|
|
|
Sum += Arr[I];
|
|
|
|
int K;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead [modernize-loop-convert]
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Arr)
|
|
|
|
// CHECK-FIXES-NEXT: Sum += Elem;
|
|
|
|
// CHECK-FIXES-NEXT: int K;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < N; ++I) {
|
|
|
|
printf("Fibonacci number is %d\n", Arr[I]);
|
|
|
|
Sum += Arr[I] + 2;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Arr)
|
|
|
|
// CHECK-FIXES-NEXT: printf("Fibonacci number is %d\n", Elem);
|
|
|
|
// CHECK-FIXES-NEXT: Sum += Elem + 2;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < N; ++I) {
|
|
|
|
int X = Arr[I];
|
|
|
|
int Y = Arr[I] + 2;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Arr)
|
|
|
|
// CHECK-FIXES-NEXT: int X = Elem;
|
|
|
|
// CHECK-FIXES-NEXT: int Y = Elem + 2;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < N; ++I) {
|
|
|
|
int X = N;
|
|
|
|
X = Arr[I];
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Arr)
|
|
|
|
// CHECK-FIXES-NEXT: int X = N;
|
|
|
|
// CHECK-FIXES-NEXT: X = Elem;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < N; ++I) {
|
|
|
|
Arr[I] += 1;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Arr)
|
|
|
|
// CHECK-FIXES-NEXT: Elem += 1;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < N; ++I) {
|
|
|
|
int X = Arr[I] + 2;
|
|
|
|
Arr[I]++;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Arr)
|
|
|
|
// CHECK-FIXES-NEXT: int X = Elem + 2;
|
|
|
|
// CHECK-FIXES-NEXT: Elem++;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < N; ++I) {
|
|
|
|
Arr[I] = 4 + Arr[I];
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Arr)
|
|
|
|
// CHECK-FIXES-NEXT: Elem = 4 + Elem;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < NMinusOne + 1; ++I) {
|
|
|
|
Sum += Arr[I];
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Arr)
|
|
|
|
// CHECK-FIXES-NEXT: Sum += Elem;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < N; ++I) {
|
|
|
|
printf("Fibonacci number %d has address %p\n", Arr[I], &Arr[I]);
|
|
|
|
Sum += Arr[I] + 2;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Arr)
|
|
|
|
// CHECK-FIXES-NEXT: printf("Fibonacci number %d has address %p\n", Elem, &Elem);
|
|
|
|
// CHECK-FIXES-NEXT: Sum += Elem + 2;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
Val Teas[N];
|
|
|
|
for (int I = 0; I < N; ++I) {
|
|
|
|
Teas[I].g();
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Tea : Teas)
|
|
|
|
// CHECK-FIXES-NEXT: Tea.g();
|
2015-09-11 18:02:07 +08:00
|
|
|
}
|
|
|
|
|
2015-10-05 19:15:39 +08:00
|
|
|
const int *constArray() {
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < N; ++I) {
|
|
|
|
printf("2 * %d = %d\n", ConstArr[I], ConstArr[I] + ConstArr[I]);
|
2015-09-11 18:02:07 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto Elem : ConstArr)
|
|
|
|
// CHECK-FIXES-NEXT: printf("2 * %d = %d\n", Elem, Elem + Elem);
|
2015-10-01 16:57:11 +08:00
|
|
|
|
|
|
|
const NonTriviallyCopyable NonCopy[N]{};
|
|
|
|
for (int I = 0; I < N; ++I) {
|
|
|
|
printf("2 * %d = %d\n", NonCopy[I].X, NonCopy[I].X + NonCopy[I].X);
|
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
|
|
|
// CHECK-FIXES: for (const auto & Elem : NonCopy)
|
|
|
|
// CHECK-FIXES-NEXT: printf("2 * %d = %d\n", Elem.X, Elem.X + Elem.X);
|
2015-10-05 19:15:39 +08:00
|
|
|
|
|
|
|
bool Something = false;
|
|
|
|
for (int I = 0; I < N; ++I) {
|
|
|
|
if (Something)
|
|
|
|
return &ConstArr[I];
|
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
|
|
|
// CHECK-FIXES: for (const auto & Elem : ConstArr)
|
|
|
|
// CHECK-FIXES-NEXT: if (Something)
|
|
|
|
// CHECK-FIXES-NEXT: return &Elem;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
struct HasArr {
|
|
|
|
int Arr[N];
|
|
|
|
Val ValArr[N];
|
|
|
|
void implicitThis() {
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < N; ++I) {
|
|
|
|
printf("%d", Arr[I]);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:5: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Arr)
|
|
|
|
// CHECK-FIXES-NEXT: printf("%d", Elem);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < N; ++I) {
|
|
|
|
printf("%d", ValArr[I].X);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:5: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : ValArr)
|
|
|
|
// CHECK-FIXES-NEXT: printf("%d", Elem.X);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
void explicitThis() {
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < N; ++I) {
|
|
|
|
printf("%d", this->Arr[I]);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:5: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : this->Arr)
|
|
|
|
// CHECK-FIXES-NEXT: printf("%d", Elem);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < N; ++I) {
|
|
|
|
printf("%d", this->ValArr[I].X);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:5: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : this->ValArr)
|
|
|
|
// CHECK-FIXES-NEXT: printf("%d", Elem.X);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2015-09-11 18:02:07 +08:00
|
|
|
// Loops whose bounds are value-dependent should not be converted.
|
2015-08-19 17:11:46 +08:00
|
|
|
template <int N>
|
|
|
|
void dependentExprBound() {
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < N; ++I)
|
|
|
|
Arr[I] = 0;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
template void dependentExprBound<20>();
|
|
|
|
|
|
|
|
void memberFunctionPointer() {
|
2015-09-25 01:02:19 +08:00
|
|
|
Val V;
|
2015-08-19 17:11:46 +08:00
|
|
|
void (Val::*mfpArr[N])(void) = {&Val::g};
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < N; ++I)
|
|
|
|
(V.*mfpArr[I])();
|
2015-08-19 17:11:46 +08:00
|
|
|
// CHECK-MESSAGES: :[[@LINE-2]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : mfpArr)
|
|
|
|
// CHECK-FIXES-NEXT: (V.*Elem)();
|
2015-09-02 22:25:08 +08:00
|
|
|
|
|
|
|
struct Foo {
|
|
|
|
int (Val::*f)();
|
2015-09-25 01:02:19 +08:00
|
|
|
} Foo[N];
|
2015-09-02 22:25:08 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < N; ++I)
|
|
|
|
int R = (V.*(Foo[I].f))();
|
2015-09-02 22:25:08 +08:00
|
|
|
// CHECK-MESSAGES: :[[@LINE-2]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Foo)
|
|
|
|
// CHECK-FIXES-NEXT: int R = (V.*(Elem.f))();
|
2015-09-02 22:25:08 +08:00
|
|
|
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace Array
|
|
|
|
|
|
|
|
namespace Iterator {
|
|
|
|
|
|
|
|
void f() {
|
|
|
|
/// begin()/end() - based for loops here:
|
2015-09-25 01:02:19 +08:00
|
|
|
T Tt;
|
|
|
|
for (T::iterator It = Tt.begin(), E = Tt.end(); It != E; ++It) {
|
|
|
|
printf("I found %d\n", *It);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Tt)
|
|
|
|
// CHECK-FIXES-NEXT: printf("I found %d\n", Elem);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
T *Pt;
|
|
|
|
for (T::iterator It = Pt->begin(), E = Pt->end(); It != E; ++It) {
|
|
|
|
printf("I found %d\n", *It);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : *Pt)
|
|
|
|
// CHECK-FIXES-NEXT: printf("I found %d\n", Elem);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
S Ss;
|
|
|
|
for (S::iterator It = Ss.begin(), E = Ss.end(); It != E; ++It) {
|
|
|
|
printf("s has value %d\n", (*It).X);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Ss)
|
|
|
|
// CHECK-FIXES-NEXT: printf("s has value %d\n", Elem.X);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
S *Ps;
|
|
|
|
for (S::iterator It = Ps->begin(), E = Ps->end(); It != E; ++It) {
|
|
|
|
printf("s has value %d\n", (*It).X);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & P : *Ps)
|
|
|
|
// CHECK-FIXES-NEXT: printf("s has value %d\n", P.X);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-10-01 16:57:11 +08:00
|
|
|
for (S::const_iterator It = Ss.cbegin(), E = Ss.cend(); It != E; ++It) {
|
|
|
|
printf("s has value %d\n", (*It).X);
|
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
|
|
|
// CHECK-FIXES: for (auto Elem : Ss)
|
|
|
|
// CHECK-FIXES-NEXT: printf("s has value %d\n", Elem.X);
|
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (S::iterator It = Ss.begin(), E = Ss.end(); It != E; ++It) {
|
|
|
|
printf("s has value %d\n", It->X);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Ss)
|
|
|
|
// CHECK-FIXES-NEXT: printf("s has value %d\n", Elem.X);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (S::iterator It = Ss.begin(), E = Ss.end(); It != E; ++It) {
|
|
|
|
It->X = 3;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Ss)
|
|
|
|
// CHECK-FIXES-NEXT: Elem.X = 3;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (S::iterator It = Ss.begin(), E = Ss.end(); It != E; ++It) {
|
|
|
|
(*It).X = 3;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Ss)
|
|
|
|
// CHECK-FIXES-NEXT: Elem.X = 3;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (S::iterator It = Ss.begin(), E = Ss.end(); It != E; ++It) {
|
|
|
|
It->nonConstFun(4, 5);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Ss)
|
|
|
|
// CHECK-FIXES-NEXT: Elem.nonConstFun(4, 5);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
U Uu;
|
|
|
|
for (U::iterator It = Uu.begin(), E = Uu.end(); It != E; ++It) {
|
|
|
|
printf("s has value %d\n", It->X);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Uu)
|
|
|
|
// CHECK-FIXES-NEXT: printf("s has value %d\n", Elem.X);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (U::iterator It = Uu.begin(), E = Uu.end(); It != E; ++It) {
|
|
|
|
printf("s has value %d\n", (*It).X);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Uu)
|
|
|
|
// CHECK-FIXES-NEXT: printf("s has value %d\n", Elem.X);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
|
|
|
U::iterator A;
|
2015-09-25 01:02:19 +08:00
|
|
|
for (U::iterator I = Uu.begin(), E = Uu.end(); I != E; ++I)
|
|
|
|
int K = A->X + I->X;
|
2015-08-19 17:11:46 +08:00
|
|
|
// CHECK-MESSAGES: :[[@LINE-2]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Uu)
|
|
|
|
// CHECK-FIXES-NEXT: int K = A->X + Elem.X;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
dependent<int> V;
|
|
|
|
for (dependent<int>::iterator It = V.begin(), E = V.end();
|
|
|
|
It != E; ++It) {
|
|
|
|
printf("Fibonacci number is %d\n", *It);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : V)
|
|
|
|
// CHECK-FIXES-NEXT: printf("Fibonacci number is %d\n", Elem);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (dependent<int>::iterator It(V.begin()), E = V.end();
|
|
|
|
It != E; ++It) {
|
|
|
|
printf("Fibonacci number is %d\n", *It);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : V)
|
|
|
|
// CHECK-FIXES-NEXT: printf("Fibonacci number is %d\n", Elem);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
doublyDependent<int, int> Intmap;
|
|
|
|
for (doublyDependent<int, int>::iterator It = Intmap.begin(), E = Intmap.end();
|
|
|
|
It != E; ++It) {
|
|
|
|
printf("Intmap[%d] = %d", It->first, It->second);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Intmap)
|
|
|
|
// CHECK-FIXES: printf("Intmap[%d] = %d", Elem.first, Elem.second);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
|
|
|
// PtrSet's iterator dereferences by value so auto & can't be used.
|
|
|
|
{
|
2015-09-25 01:02:19 +08:00
|
|
|
PtrSet<int *> Val_int_ptrs;
|
|
|
|
for (PtrSet<int *>::iterator I = Val_int_ptrs.begin(),
|
|
|
|
E = Val_int_ptrs.end();
|
2015-08-19 17:11:46 +08:00
|
|
|
I != E; ++I) {
|
2015-09-11 18:02:07 +08:00
|
|
|
(void) *I;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
2015-09-11 18:02:07 +08:00
|
|
|
// CHECK-MESSAGES: :[[@LINE-5]]:5: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto Val_int_ptr : Val_int_ptrs)
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// This container uses an iterator where the derefence type is a typedef of
|
|
|
|
// a reference type. Make sure non-const auto & is still used. A failure here
|
|
|
|
// means canonical types aren't being tested.
|
|
|
|
{
|
2015-09-25 01:02:19 +08:00
|
|
|
TypedefDerefContainer<int> Int_ptrs;
|
|
|
|
for (TypedefDerefContainer<int>::iterator I = Int_ptrs.begin(),
|
|
|
|
E = Int_ptrs.end();
|
2015-08-19 17:11:46 +08:00
|
|
|
I != E; ++I) {
|
2015-09-11 18:02:07 +08:00
|
|
|
(void) *I;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
2015-09-11 18:02:07 +08:00
|
|
|
// CHECK-MESSAGES: :[[@LINE-5]]:5: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Int_ptr : Int_ptrs)
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
// Iterators returning an rvalue reference should disqualify the loop from
|
|
|
|
// transformation.
|
2015-09-25 01:02:19 +08:00
|
|
|
RValueDerefContainer<int> Container;
|
|
|
|
for (RValueDerefContainer<int>::iterator I = Container.begin(),
|
|
|
|
E = Container.end();
|
2015-08-19 17:11:46 +08:00
|
|
|
I != E; ++I) {
|
2015-09-11 18:02:07 +08:00
|
|
|
(void) *I;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
}
|
2015-09-24 23:29:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
dependent<Val *> Dpp;
|
|
|
|
for (dependent<Val *>::iterator I = Dpp.begin(), E = Dpp.end(); I != E; ++I) {
|
|
|
|
printf("%d\n", (**I).X);
|
2015-09-24 23:29:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Dpp)
|
|
|
|
// CHECK-FIXES-NEXT: printf("%d\n", (*Elem).X);
|
2015-09-24 23:29:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (dependent<Val *>::iterator I = Dpp.begin(), E = Dpp.end(); I != E; ++I) {
|
|
|
|
printf("%d\n", (*I)->X);
|
2015-09-24 23:29:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : Dpp)
|
|
|
|
// CHECK-FIXES-NEXT: printf("%d\n", Elem->X);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
// Tests to verify the proper use of auto where the init variable type and the
|
|
|
|
// initializer type differ or are mostly the same except for const qualifiers.
|
|
|
|
void different_type() {
|
2015-09-25 01:02:19 +08:00
|
|
|
// Ss.begin() returns a type 'iterator' which is just a non-const pointer and
|
2015-08-19 17:11:46 +08:00
|
|
|
// differs from const_iterator only on the const qualification.
|
2015-09-25 01:02:19 +08:00
|
|
|
S Ss;
|
|
|
|
for (S::const_iterator It = Ss.begin(), E = Ss.end(); It != E; ++It) {
|
|
|
|
printf("s has value %d\n", (*It).X);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto Elem : Ss)
|
|
|
|
// CHECK-FIXES-NEXT: printf("s has value %d\n", Elem.X);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
S *Ps;
|
|
|
|
for (S::const_iterator It = Ps->begin(), E = Ps->end(); It != E; ++It) {
|
|
|
|
printf("s has value %d\n", (*It).X);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto P : *Ps)
|
|
|
|
// CHECK-FIXES-NEXT: printf("s has value %d\n", P.X);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
// V.begin() returns a user-defined type 'iterator' which, since it's
|
2015-08-19 17:11:46 +08:00
|
|
|
// different from const_iterator, disqualifies these loops from
|
|
|
|
// transformation.
|
2015-09-25 01:02:19 +08:00
|
|
|
dependent<int> V;
|
|
|
|
for (dependent<int>::const_iterator It = V.begin(), E = V.end();
|
|
|
|
It != E; ++It) {
|
|
|
|
printf("Fibonacci number is %d\n", *It);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (dependent<int>::const_iterator It(V.begin()), E = V.end();
|
|
|
|
It != E; ++It) {
|
|
|
|
printf("Fibonacci number is %d\n", *It);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Tests to ensure that an implicit 'this' is picked up as the container.
|
|
|
|
// If member calls are made to 'this' within the loop, the transform becomes
|
|
|
|
// risky as these calls may affect state that affects the loop.
|
|
|
|
class C {
|
|
|
|
public:
|
|
|
|
typedef MutableVal *iterator;
|
|
|
|
typedef const MutableVal *const_iterator;
|
|
|
|
|
|
|
|
iterator begin();
|
|
|
|
iterator end();
|
|
|
|
const_iterator begin() const;
|
|
|
|
const_iterator end() const;
|
|
|
|
|
|
|
|
void doSomething();
|
|
|
|
void doSomething() const;
|
|
|
|
|
|
|
|
void doLoop() {
|
2015-09-11 18:02:07 +08:00
|
|
|
for (iterator I = begin(), E = end(); I != E; ++I)
|
|
|
|
(void) *I;
|
2015-08-19 17:11:46 +08:00
|
|
|
// CHECK-MESSAGES: :[[@LINE-2]]:5: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : *this)
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-11 18:02:07 +08:00
|
|
|
for (iterator I = C::begin(), E = C::end(); I != E; ++I)
|
|
|
|
(void) *I;
|
2015-08-19 17:11:46 +08:00
|
|
|
// CHECK-MESSAGES: :[[@LINE-2]]:5: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : *this)
|
2015-08-19 17:11:46 +08:00
|
|
|
|
|
|
|
for (iterator I = begin(), E = end(); I != E; ++I) {
|
2015-09-11 18:02:07 +08:00
|
|
|
(void) *I;
|
2015-08-19 17:11:46 +08:00
|
|
|
doSomething();
|
|
|
|
}
|
|
|
|
|
2015-09-11 18:02:07 +08:00
|
|
|
for (iterator I = begin(); I != end(); ++I)
|
|
|
|
(void) *I;
|
2015-08-19 17:11:46 +08:00
|
|
|
// CHECK-MESSAGES: :[[@LINE-2]]:5: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : *this)
|
2015-08-19 17:11:46 +08:00
|
|
|
|
|
|
|
for (iterator I = begin(); I != end(); ++I) {
|
2015-09-11 18:02:07 +08:00
|
|
|
(void) *I;
|
2015-08-19 17:11:46 +08:00
|
|
|
doSomething();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void doLoop() const {
|
2015-09-11 18:02:07 +08:00
|
|
|
for (const_iterator I = begin(), E = end(); I != E; ++I)
|
|
|
|
(void) *I;
|
2015-08-19 17:11:46 +08:00
|
|
|
// CHECK-MESSAGES: :[[@LINE-2]]:5: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto Elem : *this)
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-11 18:02:07 +08:00
|
|
|
for (const_iterator I = C::begin(), E = C::end(); I != E; ++I)
|
|
|
|
(void) *I;
|
2015-08-19 17:11:46 +08:00
|
|
|
// CHECK-MESSAGES: :[[@LINE-2]]:5: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto Elem : *this)
|
2015-08-19 17:11:46 +08:00
|
|
|
|
|
|
|
for (const_iterator I = begin(), E = end(); I != E; ++I) {
|
2015-09-11 18:02:07 +08:00
|
|
|
(void) *I;
|
2015-08-19 17:11:46 +08:00
|
|
|
doSomething();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
class C2 {
|
|
|
|
public:
|
|
|
|
typedef MutableVal *iterator;
|
|
|
|
|
|
|
|
iterator begin() const;
|
|
|
|
iterator end() const;
|
|
|
|
|
|
|
|
void doLoop() {
|
|
|
|
// The implicit 'this' will have an Implicit cast to const C2* wrapped
|
|
|
|
// around it. Make sure the replacement still happens.
|
2015-09-11 18:02:07 +08:00
|
|
|
for (iterator I = begin(), E = end(); I != E; ++I)
|
|
|
|
(void) *I;
|
2015-08-19 17:11:46 +08:00
|
|
|
// CHECK-MESSAGES: :[[@LINE-2]]:5: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : *this)
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace Iterator
|
|
|
|
|
|
|
|
namespace PseudoArray {
|
|
|
|
|
|
|
|
const int N = 6;
|
2015-09-25 01:02:19 +08:00
|
|
|
dependent<int> V;
|
|
|
|
dependent<int> *Pv;
|
2015-10-01 16:57:11 +08:00
|
|
|
const dependent<NonTriviallyCopyable> Constv;
|
|
|
|
const dependent<NonTriviallyCopyable> *Pconstv;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
transparent<dependent<int>> Cv;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
|
|
|
void f() {
|
2015-09-25 01:02:19 +08:00
|
|
|
int Sum = 0;
|
|
|
|
for (int I = 0, E = V.size(); I < E; ++I) {
|
|
|
|
printf("Fibonacci number is %d\n", V[I]);
|
|
|
|
Sum += V[I] + 2;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : V)
|
|
|
|
// CHECK-FIXES-NEXT: printf("Fibonacci number is %d\n", Elem);
|
|
|
|
// CHECK-FIXES-NEXT: Sum += Elem + 2;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0, E = V.size(); I < E; ++I) {
|
|
|
|
printf("Fibonacci number is %d\n", V.at(I));
|
|
|
|
Sum += V.at(I) + 2;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : V)
|
|
|
|
// CHECK-FIXES-NEXT: printf("Fibonacci number is %d\n", Elem);
|
|
|
|
// CHECK-FIXES-NEXT: Sum += Elem + 2;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0, E = Pv->size(); I < E; ++I) {
|
|
|
|
printf("Fibonacci number is %d\n", Pv->at(I));
|
|
|
|
Sum += Pv->at(I) + 2;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : *Pv)
|
|
|
|
// CHECK-FIXES-NEXT: printf("Fibonacci number is %d\n", Elem);
|
|
|
|
// CHECK-FIXES-NEXT: Sum += Elem + 2;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
|
|
|
// This test will fail if size() isn't called repeatedly, since it
|
|
|
|
// returns unsigned int, and 0 is deduced to be signed int.
|
|
|
|
// FIXME: Insert the necessary explicit conversion, or write out the types
|
|
|
|
// explicitly.
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < Pv->size(); ++I) {
|
|
|
|
printf("Fibonacci number is %d\n", (*Pv).at(I));
|
|
|
|
Sum += (*Pv)[I] + 2;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : *Pv)
|
|
|
|
// CHECK-FIXES-NEXT: printf("Fibonacci number is %d\n", Elem);
|
|
|
|
// CHECK-FIXES-NEXT: Sum += Elem + 2;
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < Cv->size(); ++I) {
|
|
|
|
printf("Fibonacci number is %d\n", Cv->at(I));
|
|
|
|
Sum += Cv->at(I) + 2;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : *Cv)
|
|
|
|
// CHECK-FIXES-NEXT: printf("Fibonacci number is %d\n", Elem);
|
|
|
|
// CHECK-FIXES-NEXT: Sum += Elem + 2;
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
|
2015-10-01 16:57:11 +08:00
|
|
|
// Ensure that 'const auto &' is used with containers of non-trivial types.
|
2015-09-11 18:02:07 +08:00
|
|
|
void constness() {
|
2015-09-25 01:02:19 +08:00
|
|
|
int Sum = 0;
|
|
|
|
for (int I = 0, E = Constv.size(); I < E; ++I) {
|
2015-10-01 16:57:11 +08:00
|
|
|
printf("Fibonacci number is %d\n", Constv[I].X);
|
|
|
|
Sum += Constv[I].X + 2;
|
2015-09-11 18:02:07 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-10-01 16:57:11 +08:00
|
|
|
// CHECK-FIXES: for (const auto & Elem : Constv)
|
|
|
|
// CHECK-FIXES-NEXT: printf("Fibonacci number is %d\n", Elem.X);
|
|
|
|
// CHECK-FIXES-NEXT: Sum += Elem.X + 2;
|
2015-09-11 18:02:07 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0, E = Constv.size(); I < E; ++I) {
|
2015-10-01 16:57:11 +08:00
|
|
|
printf("Fibonacci number is %d\n", Constv.at(I).X);
|
|
|
|
Sum += Constv.at(I).X + 2;
|
2015-09-11 18:02:07 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-10-01 16:57:11 +08:00
|
|
|
// CHECK-FIXES: for (const auto & Elem : Constv)
|
|
|
|
// CHECK-FIXES-NEXT: printf("Fibonacci number is %d\n", Elem.X);
|
|
|
|
// CHECK-FIXES-NEXT: Sum += Elem.X + 2;
|
2015-09-11 18:02:07 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0, E = Pconstv->size(); I < E; ++I) {
|
2015-10-01 16:57:11 +08:00
|
|
|
printf("Fibonacci number is %d\n", Pconstv->at(I).X);
|
|
|
|
Sum += Pconstv->at(I).X + 2;
|
2015-09-11 18:02:07 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-10-01 16:57:11 +08:00
|
|
|
// CHECK-FIXES: for (const auto & Elem : *Pconstv)
|
|
|
|
// CHECK-FIXES-NEXT: printf("Fibonacci number is %d\n", Elem.X);
|
|
|
|
// CHECK-FIXES-NEXT: Sum += Elem.X + 2;
|
2015-09-11 18:02:07 +08:00
|
|
|
|
|
|
|
// This test will fail if size() isn't called repeatedly, since it
|
|
|
|
// returns unsigned int, and 0 is deduced to be signed int.
|
|
|
|
// FIXME: Insert the necessary explicit conversion, or write out the types
|
|
|
|
// explicitly.
|
2015-09-25 01:02:19 +08:00
|
|
|
for (int I = 0; I < Pconstv->size(); ++I) {
|
2015-10-01 16:57:11 +08:00
|
|
|
printf("Fibonacci number is %d\n", (*Pconstv).at(I).X);
|
|
|
|
Sum += (*Pconstv)[I].X + 2;
|
2015-09-11 18:02:07 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-10-01 16:57:11 +08:00
|
|
|
// CHECK-FIXES: for (const auto & Elem : *Pconstv)
|
|
|
|
// CHECK-FIXES-NEXT: printf("Fibonacci number is %d\n", Elem.X);
|
|
|
|
// CHECK-FIXES-NEXT: Sum += Elem.X + 2;
|
2015-09-11 18:02:07 +08:00
|
|
|
}
|
|
|
|
|
2015-10-01 16:57:11 +08:00
|
|
|
void constRef(const dependent<int>& ConstVRef) {
|
2015-09-24 02:40:47 +08:00
|
|
|
int sum = 0;
|
|
|
|
// FIXME: This does not work with size_t (probably due to the implementation
|
|
|
|
// of dependent); make dependent work exactly like a std container type.
|
|
|
|
for (int i = 0; i < ConstVRef.size(); ++i) {
|
|
|
|
sum += ConstVRef[i];
|
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto Elem : ConstVRef)
|
|
|
|
// CHECK-FIXES-NEXT: sum += Elem;
|
2015-09-24 06:28:14 +08:00
|
|
|
|
|
|
|
for (auto I = ConstVRef.begin(), E = ConstVRef.end(); I != E; ++I) {
|
|
|
|
sum += *I;
|
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto Elem : ConstVRef)
|
|
|
|
// CHECK-FIXES-NEXT: sum += Elem;
|
2015-09-24 02:40:47 +08:00
|
|
|
}
|
|
|
|
|
2015-08-19 17:11:46 +08:00
|
|
|
// Check for loops that don't mention containers.
|
|
|
|
void noContainer() {
|
2015-09-25 01:02:19 +08:00
|
|
|
for (auto I = 0; I < V.size(); ++I) {
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (auto I = 0; I < V.size(); ++I)
|
2015-08-19 17:11:46 +08:00
|
|
|
;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct NoBeginEnd {
|
|
|
|
unsigned size() const;
|
2015-09-11 18:02:07 +08:00
|
|
|
unsigned& operator[](int);
|
|
|
|
const unsigned& operator[](int) const;
|
2015-08-19 17:11:46 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
struct NoConstBeginEnd {
|
|
|
|
NoConstBeginEnd();
|
|
|
|
unsigned size() const;
|
2015-09-01 23:05:15 +08:00
|
|
|
unsigned* begin();
|
|
|
|
unsigned* end();
|
2015-09-11 18:02:07 +08:00
|
|
|
unsigned& operator[](int);
|
|
|
|
const unsigned& operator[](int) const;
|
2015-08-19 17:11:46 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
struct ConstBeginEnd {
|
|
|
|
ConstBeginEnd();
|
|
|
|
unsigned size() const;
|
2015-09-01 23:05:15 +08:00
|
|
|
unsigned* begin() const;
|
|
|
|
unsigned* end() const;
|
2015-09-11 18:02:07 +08:00
|
|
|
unsigned& operator[](int);
|
|
|
|
const unsigned& operator[](int) const;
|
2015-08-19 17:11:46 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
// Shouldn't transform pseudo-array uses if the container doesn't provide
|
|
|
|
// begin() and end() of the right const-ness.
|
|
|
|
void NoBeginEndTest() {
|
|
|
|
NoBeginEnd NBE;
|
2015-09-25 01:02:19 +08:00
|
|
|
for (unsigned I = 0, E = NBE.size(); I < E; ++I)
|
|
|
|
printf("%d\n", NBE[I]);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
const NoConstBeginEnd Const_NCBE;
|
|
|
|
for (unsigned I = 0, E = Const_NCBE.size(); I < E; ++I)
|
|
|
|
printf("%d\n", Const_NCBE[I]);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
|
|
|
ConstBeginEnd CBE;
|
2015-09-25 01:02:19 +08:00
|
|
|
for (unsigned I = 0, E = CBE.size(); I < E; ++I)
|
|
|
|
printf("%d\n", CBE[I]);
|
2015-08-19 17:11:46 +08:00
|
|
|
// CHECK-MESSAGES: :[[@LINE-2]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto & Elem : CBE)
|
|
|
|
// CHECK-FIXES-NEXT: printf("%d\n", Elem);
|
2015-08-19 17:11:46 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
const ConstBeginEnd Const_CBE;
|
|
|
|
for (unsigned I = 0, E = Const_CBE.size(); I < E; ++I)
|
|
|
|
printf("%d\n", Const_CBE[I]);
|
2015-08-19 17:11:46 +08:00
|
|
|
// CHECK-MESSAGES: :[[@LINE-2]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto Elem : Const_CBE)
|
|
|
|
// CHECK-FIXES-NEXT: printf("%d\n", Elem);
|
2015-09-01 23:05:15 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
struct DerefByValue {
|
|
|
|
DerefByValue();
|
|
|
|
struct iter { unsigned operator*(); };
|
|
|
|
unsigned size() const;
|
|
|
|
iter begin();
|
|
|
|
iter end();
|
|
|
|
unsigned operator[](int);
|
|
|
|
};
|
|
|
|
|
2015-09-08 17:01:21 +08:00
|
|
|
void derefByValueTest() {
|
2015-09-01 23:05:15 +08:00
|
|
|
DerefByValue DBV;
|
2015-09-25 01:02:19 +08:00
|
|
|
for (unsigned I = 0, E = DBV.size(); I < E; ++I) {
|
|
|
|
printf("%d\n", DBV[I]);
|
2015-09-01 23:05:15 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto Elem : DBV)
|
|
|
|
// CHECK-FIXES-NEXT: printf("%d\n", Elem);
|
2015-09-01 23:05:15 +08:00
|
|
|
|
2015-09-25 01:02:19 +08:00
|
|
|
for (unsigned I = 0, E = DBV.size(); I < E; ++I) {
|
|
|
|
auto f = [DBV, I]() {};
|
|
|
|
printf("%d\n", DBV[I]);
|
2015-09-08 17:01:21 +08:00
|
|
|
}
|
|
|
|
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
|
2015-09-25 01:02:19 +08:00
|
|
|
// CHECK-FIXES: for (auto Elem : DBV)
|
|
|
|
// CHECK-FIXES-NEXT: auto f = [DBV, &Elem]() {};
|
|
|
|
// CHECK-FIXES-NEXT: printf("%d\n", Elem);
|
2015-08-19 17:11:46 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace PseudoArray
|