summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/test/clang-tidy/modernize-loop-convert-basic.cpp
diff options
context:
space:
mode:
authorAngel Garcia Gomez <angelgarcia@google.com>2015-10-01 08:57:11 +0000
committerAngel Garcia Gomez <angelgarcia@google.com>2015-10-01 08:57:11 +0000
commit2bfb7cbddbb618c6ce493b292f63c6453d2458c5 (patch)
treef3fa98b1bb4957eabc315ef3602b90626d4027d7 /clang-tools-extra/test/clang-tidy/modernize-loop-convert-basic.cpp
parent7362982e6229d0563a68f40d63be3acc0fc79ee9 (diff)
downloadbcm5719-llvm-2bfb7cbddbb618c6ce493b292f63c6453d2458c5.tar.gz
bcm5719-llvm-2bfb7cbddbb618c6ce493b292f63c6453d2458c5.zip
Add support for 'cbegin()' and 'cend()' on modernize-loop-convert.
Summary: This fixes https://llvm.org/bugs/show_bug.cgi?id=22196 . Also add a non-trivially copyable type to fix some tests that were meant to be about using const-refs, but were changed in r248438. Reviewers: klimek Subscribers: alexfh, cfe-commits Differential Revision: http://reviews.llvm.org/D13292 llvm-svn: 248994
Diffstat (limited to 'clang-tools-extra/test/clang-tidy/modernize-loop-convert-basic.cpp')
-rw-r--r--clang-tools-extra/test/clang-tidy/modernize-loop-convert-basic.cpp62
1 files changed, 39 insertions, 23 deletions
diff --git a/clang-tools-extra/test/clang-tidy/modernize-loop-convert-basic.cpp b/clang-tools-extra/test/clang-tidy/modernize-loop-convert-basic.cpp
index 49acce0721c..42a5d5cdc37 100644
--- a/clang-tools-extra/test/clang-tidy/modernize-loop-convert-basic.cpp
+++ b/clang-tools-extra/test/clang-tidy/modernize-loop-convert-basic.cpp
@@ -104,6 +104,14 @@ void constArray() {
// CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
// CHECK-FIXES: for (auto Elem : ConstArr)
// CHECK-FIXES-NEXT: printf("2 * %d = %d\n", Elem, Elem + Elem);
+
+ 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);
}
struct HasArr {
@@ -209,6 +217,13 @@ void f() {
// CHECK-FIXES: for (auto & P : *Ps)
// CHECK-FIXES-NEXT: printf("s has value %d\n", P.X);
+ 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);
+
for (S::iterator It = Ss.begin(), E = Ss.end(); It != E; ++It) {
printf("s has value %d\n", It->X);
}
@@ -459,8 +474,8 @@ namespace PseudoArray {
const int N = 6;
dependent<int> V;
dependent<int> *Pv;
-const dependent<int> Constv;
-const dependent<int> *Pconstv;
+const dependent<NonTriviallyCopyable> Constv;
+const dependent<NonTriviallyCopyable> *Pconstv;
transparent<dependent<int>> Cv;
@@ -516,50 +531,51 @@ void f() {
// CHECK-FIXES-NEXT: Sum += Elem + 2;
}
+// Ensure that 'const auto &' is used with containers of non-trivial types.
void constness() {
int Sum = 0;
for (int I = 0, E = Constv.size(); I < E; ++I) {
- printf("Fibonacci number is %d\n", Constv[I]);
- Sum += Constv[I] + 2;
+ printf("Fibonacci number is %d\n", Constv[I].X);
+ Sum += Constv[I].X + 2;
}
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
- // CHECK-FIXES: for (auto Elem : Constv)
- // CHECK-FIXES-NEXT: printf("Fibonacci number is %d\n", Elem);
- // CHECK-FIXES-NEXT: Sum += Elem + 2;
+ // 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;
for (int I = 0, E = Constv.size(); I < E; ++I) {
- printf("Fibonacci number is %d\n", Constv.at(I));
- Sum += Constv.at(I) + 2;
+ printf("Fibonacci number is %d\n", Constv.at(I).X);
+ Sum += Constv.at(I).X + 2;
}
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
- // CHECK-FIXES: for (auto Elem : Constv)
- // CHECK-FIXES-NEXT: printf("Fibonacci number is %d\n", Elem);
- // CHECK-FIXES-NEXT: Sum += Elem + 2;
+ // 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;
for (int I = 0, E = Pconstv->size(); I < E; ++I) {
- printf("Fibonacci number is %d\n", Pconstv->at(I));
- Sum += Pconstv->at(I) + 2;
+ printf("Fibonacci number is %d\n", Pconstv->at(I).X);
+ Sum += Pconstv->at(I).X + 2;
}
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
- // CHECK-FIXES: for (auto Elem : *Pconstv)
- // CHECK-FIXES-NEXT: printf("Fibonacci number is %d\n", Elem);
- // CHECK-FIXES-NEXT: Sum += Elem + 2;
+ // 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;
// 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.
for (int I = 0; I < Pconstv->size(); ++I) {
- printf("Fibonacci number is %d\n", (*Pconstv).at(I));
- Sum += (*Pconstv)[I] + 2;
+ printf("Fibonacci number is %d\n", (*Pconstv).at(I).X);
+ Sum += (*Pconstv)[I].X + 2;
}
// CHECK-MESSAGES: :[[@LINE-4]]:3: warning: use range-based for loop instead
- // CHECK-FIXES: for (auto Elem : *Pconstv)
- // CHECK-FIXES-NEXT: printf("Fibonacci number is %d\n", Elem);
- // CHECK-FIXES-NEXT: Sum += Elem + 2;
+ // 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;
}
-void ConstRef(const dependent<int>& ConstVRef) {
+void constRef(const dependent<int>& ConstVRef) {
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.
OpenPOWER on IntegriCloud