[clang-tools-extra] r246550 - Fix several corner cases for loop-convert check.

Angel Garcia Gomez via cfe-commits cfe-commits at lists.llvm.org
Tue Sep 1 08:05:16 PDT 2015


Author: angelgarcia
Date: Tue Sep  1 10:05:15 2015
New Revision: 246550

URL: http://llvm.org/viewvc/llvm-project?rev=246550&view=rev
Log:
Fix several corner cases for loop-convert check.

Summary: Reduced the amount of wrong conversions of this check.

Reviewers: klimek

Subscribers: alexfh, cfe-commits

Differential Revision: http://reviews.llvm.org/D12530

Modified:
    clang-tools-extra/trunk/clang-tidy/modernize/LoopConvertCheck.cpp
    clang-tools-extra/trunk/clang-tidy/modernize/LoopConvertUtils.cpp
    clang-tools-extra/trunk/clang-tidy/modernize/LoopConvertUtils.h
    clang-tools-extra/trunk/test/clang-tidy/modernize-loop-convert-basic.cpp
    clang-tools-extra/trunk/test/clang-tidy/modernize-loop-convert-extra.cpp
    clang-tools-extra/trunk/test/clang-tidy/modernize-loop-convert-negative.cpp

Modified: clang-tools-extra/trunk/clang-tidy/modernize/LoopConvertCheck.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/modernize/LoopConvertCheck.cpp?rev=246550&r1=246549&r2=246550&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/modernize/LoopConvertCheck.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/modernize/LoopConvertCheck.cpp Tue Sep  1 10:05:15 2015
@@ -364,6 +364,23 @@ static bool isDirectMemberExpr(const Exp
   return false;
 }
 
+/// \brief Returns true when it can be guaranteed that the elements of the
+/// container are not being modified.
+static bool usagesAreConst(const UsageResult &Usages) {
+  // FIXME: Make this function more generic.
+  return Usages.empty();
+}
+
+/// \brief Returns true if the elements of the container are never accessed
+/// by reference.
+static bool usagesReturnRValues(const UsageResult &Usages) {
+  for (const auto &U : Usages) {
+    if (!U.Expression->isRValue())
+      return false;
+  }
+  return true;
+}
+
 LoopConvertCheck::LoopConvertCheck(StringRef Name, ClangTidyContext *Context)
     : ClangTidyCheck(Name, Context), TUInfo(new TUTrackingInfo),
       MinConfidence(StringSwitch<Confidence::Level>(
@@ -452,7 +469,8 @@ void LoopConvertCheck::doConversion(
   StringRef MaybeDereference = ContainerNeedsDereference ? "*" : "";
   std::string TypeString = AutoRefType.getAsString();
   std::string Range = ("(" + TypeString + " " + VarName + " : " +
-                       MaybeDereference + ContainerString + ")").str();
+                       MaybeDereference + ContainerString + ")")
+                          .str();
   Diag << FixItHint::CreateReplacement(
       CharSourceRange::getTokenRange(ParenRange), Range);
   TUInfo->getGeneratedDecls().insert(make_pair(TheLoop, VarName));
@@ -464,7 +482,7 @@ void LoopConvertCheck::doConversion(
 StringRef LoopConvertCheck::checkRejections(ASTContext *Context,
                                             const Expr *ContainerExpr,
                                             const ForStmt *TheLoop) {
-  // If we already modified the reange of this for loop, don't do any further
+  // If we already modified the range of this for loop, don't do any further
   // updates on this iteration.
   if (TUInfo->getReplacedVars().count(TheLoop))
     return "";
@@ -525,6 +543,18 @@ void LoopConvertCheck::findAndVerifyUsag
     if (!getReferencedVariable(ContainerExpr) &&
         !isDirectMemberExpr(ContainerExpr))
       ConfidenceLevel.lowerTo(Confidence::CL_Risky);
+  } else if (FixerKind == LFK_PseudoArray) {
+    if (!DerefByValue && !DerefByConstRef) {
+      const UsageResult &Usages = Finder.getUsages();
+      if (usagesAreConst(Usages)) {
+        // FIXME: check if the type is trivially copiable.
+        DerefByConstRef = true;
+      } else if (usagesReturnRValues(Usages)) {
+        // If the index usages (dereference, subscript, at) return RValues,
+        // then we should not use a non-const reference.
+        DerefByValue = true;
+      }
+    }
   }
 
   StringRef ContainerString = checkRejections(Context, ContainerExpr, TheLoop);

Modified: clang-tools-extra/trunk/clang-tidy/modernize/LoopConvertUtils.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/modernize/LoopConvertUtils.cpp?rev=246550&r1=246549&r2=246550&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/modernize/LoopConvertUtils.cpp (original)
+++ clang-tools-extra/trunk/clang-tidy/modernize/LoopConvertUtils.cpp Tue Sep  1 10:05:15 2015
@@ -425,12 +425,8 @@ ForLoopIndexUseVisitor::ForLoopIndexUseV
       ConfidenceLevel(Confidence::CL_Safe), NextStmtParent(nullptr),
       CurrStmtParent(nullptr), ReplaceWithAliasUse(false),
       AliasFromForInit(false) {
-  if (ContainerExpr) {
+  if (ContainerExpr)
     addComponent(ContainerExpr);
-    FoldingSetNodeID ID;
-    const Expr *E = ContainerExpr->IgnoreParenImpCasts();
-    E->Profile(ID, *Context, true);
-  }
 }
 
 bool ForLoopIndexUseVisitor::findAndVerifyUsages(const Stmt *Body) {
@@ -521,7 +517,13 @@ bool ForLoopIndexUseVisitor::TraverseMem
     }
   }
 
-  if (Member->isArrow() && Obj && exprReferencesVariable(IndexVar, Obj)) {
+  if (Obj && exprReferencesVariable(IndexVar, Obj)) {
+    // Member calls on the iterator with '.' are not allowed.
+    if (!Member->isArrow()) {
+      OnlyUsedAsIndex = false;
+      return true;
+    }
+
     if (ExprType.isNull())
       ExprType = Obj->getType();
 
@@ -539,7 +541,7 @@ bool ForLoopIndexUseVisitor::TraverseMem
       return true;
     }
   }
-  return TraverseStmt(Member->getBase());
+  return VisitorBase::TraverseMemberExpr(Member);
 }
 
 /// \brief If a member function call is the at() accessor on the container with
@@ -576,7 +578,7 @@ bool ForLoopIndexUseVisitor::TraverseCXX
 }
 
 /// \brief If an overloaded operator call is a dereference of IndexVar or
-/// a subscript of a the container with IndexVar as the single argument,
+/// a subscript of the container with IndexVar as the single argument,
 /// include it as a valid usage and prune the traversal.
 ///
 /// For example, given
@@ -682,9 +684,6 @@ bool ForLoopIndexUseVisitor::TraverseArr
 ///     i.insert(0);
 ///   for (vector<int>::iterator i = container.begin(), e = container.end();
 ///        i != e; ++i)
-///     i.insert(0);
-///   for (vector<int>::iterator i = container.begin(), e = container.end();
-///        i != e; ++i)
 ///     if (i + 1 != e)
 ///       printf("%d", *i);
 /// \endcode
@@ -700,7 +699,9 @@ bool ForLoopIndexUseVisitor::TraverseArr
 /// \endcode
 bool ForLoopIndexUseVisitor::VisitDeclRefExpr(DeclRefExpr *E) {
   const ValueDecl *TheDecl = E->getDecl();
-  if (areSameVariable(IndexVar, TheDecl) || areSameVariable(EndVar, TheDecl))
+  if (areSameVariable(IndexVar, TheDecl) ||
+      exprReferencesVariable(IndexVar, E) || areSameVariable(EndVar, TheDecl) ||
+      exprReferencesVariable(EndVar, E))
     OnlyUsedAsIndex = false;
   if (containsExpr(Context, &DependentExprs, E))
     ConfidenceLevel.lowerTo(Confidence::CL_Risky);

Modified: clang-tools-extra/trunk/clang-tidy/modernize/LoopConvertUtils.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/modernize/LoopConvertUtils.h?rev=246550&r1=246549&r2=246550&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-tidy/modernize/LoopConvertUtils.h (original)
+++ clang-tools-extra/trunk/clang-tidy/modernize/LoopConvertUtils.h Tue Sep  1 10:05:15 2015
@@ -197,14 +197,14 @@ private:
 /// \brief The information needed to describe a valid convertible usage
 /// of an array index or iterator.
 struct Usage {
-  const Expr *E;
+  const Expr *Expression;
   bool IsArrow;
   SourceRange Range;
 
   explicit Usage(const Expr *E)
-      : E(E), IsArrow(false), Range(E->getSourceRange()) {}
+      : Expression(E), IsArrow(false), Range(Expression->getSourceRange()) {}
   Usage(const Expr *E, bool IsArrow, SourceRange Range)
-      : E(E), IsArrow(IsArrow), Range(std::move(Range)) {}
+      : Expression(E), IsArrow(IsArrow), Range(std::move(Range)) {}
 };
 
 /// \brief A class to encapsulate lowering of the tool's confidence level.

Modified: clang-tools-extra/trunk/test/clang-tidy/modernize-loop-convert-basic.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/modernize-loop-convert-basic.cpp?rev=246550&r1=246549&r2=246550&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/modernize-loop-convert-basic.cpp (original)
+++ clang-tools-extra/trunk/test/clang-tidy/modernize-loop-convert-basic.cpp Tue Sep  1 10:05:15 2015
@@ -494,12 +494,12 @@ void noContainer() {
   for (auto i = 0; i < v.size(); ++i) {
   }
   // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: use range-based for loop instead
-  // CHECK-FIXES: for (auto & elem : v) {
+  // CHECK-FIXES: for (const auto & elem : v) {
 
   for (auto i = 0; i < v.size(); ++i)
     ;
   // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: use range-based for loop instead
-  // CHECK-FIXES: for (auto & elem : v)
+  // CHECK-FIXES: for (const auto & elem : v)
 }
 
 struct NoBeginEnd {
@@ -509,15 +509,15 @@ struct NoBeginEnd {
 struct NoConstBeginEnd {
   NoConstBeginEnd();
   unsigned size() const;
-  unsigned begin();
-  unsigned end();
+  unsigned* begin();
+  unsigned* end();
 };
 
 struct ConstBeginEnd {
   ConstBeginEnd();
   unsigned size() const;
-  unsigned begin() const;
-  unsigned end() const;
+  unsigned* begin() const;
+  unsigned* end() const;
 };
 
 // Shouldn't transform pseudo-array uses if the container doesn't provide
@@ -535,13 +535,32 @@ void NoBeginEndTest() {
   for (unsigned i = 0, e = CBE.size(); i < e; ++i) {
   }
   // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: use range-based for loop instead
-  // CHECK-FIXES: for (auto & elem : CBE) {
+  // CHECK-FIXES: for (const auto & elem : CBE) {
 
   const ConstBeginEnd const_CBE;
   for (unsigned i = 0, e = const_CBE.size(); i < e; ++i) {
   }
   // CHECK-MESSAGES: :[[@LINE-2]]:3: warning: use range-based for loop instead
-  // CHECK-FIXES: for (auto & elem : const_CBE) {
+  // CHECK-FIXES: for (const auto & elem : const_CBE) {
+}
+
+struct DerefByValue {
+  DerefByValue();
+  struct iter { unsigned operator*(); };
+  unsigned size() const;
+  iter begin();
+  iter end();
+  unsigned operator[](int);
+};
+
+void DerefByValueTest() {
+  DerefByValue DBV;
+  for (unsigned i = 0, e = DBV.size(); i < e; ++i) {
+    printf("%d\n", DBV[i]);
+  }
+  // CHECK-MESSAGES: :[[@LINE-3]]:3: warning: use range-based for loop instead
+  // CHECK-FIXES: for (auto && elem : DBV) {
+
 }
 
 } // namespace PseudoArray

Modified: clang-tools-extra/trunk/test/clang-tidy/modernize-loop-convert-extra.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/modernize-loop-convert-extra.cpp?rev=246550&r1=246549&r2=246550&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/modernize-loop-convert-extra.cpp (original)
+++ clang-tools-extra/trunk/test/clang-tidy/modernize-loop-convert-extra.cpp Tue Sep  1 10:05:15 2015
@@ -387,6 +387,14 @@ void f() {
 
 namespace Nesting {
 
+void g(S::iterator it);
+void const_g(S::const_iterator it);
+class Foo {
+ public:
+  void g(S::iterator it);
+  void const_g(S::const_iterator it);
+};
+
 void f() {
   const int N = 10;
   const int M = 15;
@@ -454,6 +462,48 @@ void f() {
   // CHECK-FIXES: for (const auto & elem : NestS) {
   // CHECK-FIXES-NEXT: for (S::const_iterator SI = (elem).begin(), SE = (elem).end(); SI != SE; ++SI) {
   // CHECK-FIXES-NEXT: printf("%d", *SI);
+
+  for (Nested<S>::const_iterator I = NestS.begin(), E = NestS.end(); I != E; ++I) {
+    const S &s = *I;
+    for (S::const_iterator SI = s.begin(), SE = s.end(); SI != SE; ++SI) {
+      printf("%d", *SI);
+      const_g(SI);
+    }
+  }
+  // CHECK-MESSAGES: :[[@LINE-7]]:3: warning: use range-based for loop instead
+  // CHECK-FIXES: for (const auto & s : NestS) {
+
+  for (Nested<S>::iterator I = NestS.begin(), E = NestS.end(); I != E; ++I) {
+    S &s = *I;
+    for (S::iterator SI = s.begin(), SE = s.end(); SI != SE; ++SI) {
+      printf("%d", *SI);
+      g(SI);
+    }
+  }
+  // CHECK-MESSAGES: :[[@LINE-7]]:3: warning: use range-based for loop instead
+  // CHECK-FIXES: for (auto & s : NestS) {
+
+  Foo foo;
+  for (Nested<S>::const_iterator I = NestS.begin(), E = NestS.end(); I != E; ++I) {
+    const S &s = *I;
+    for (S::const_iterator SI = s.begin(), SE = s.end(); SI != SE; ++SI) {
+      printf("%d", *SI);
+      foo.const_g(SI);
+    }
+  }
+  // CHECK-MESSAGES: :[[@LINE-7]]:3: warning: use range-based for loop instead
+  // CHECK-FIXES: for (const auto & s : NestS) {
+
+  for (Nested<S>::iterator I = NestS.begin(), E = NestS.end(); I != E; ++I) {
+    S &s = *I;
+    for (S::iterator SI = s.begin(), SE = s.end(); SI != SE; ++SI) {
+      printf("%d", *SI);
+      foo.g(SI);
+    }
+  }
+  // CHECK-MESSAGES: :[[@LINE-7]]:3: warning: use range-based for loop instead
+  // CHECK-FIXES: for (auto & s : NestS) {
+
 }
 
 } // namespace Nesting

Modified: clang-tools-extra/trunk/test/clang-tidy/modernize-loop-convert-negative.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/modernize-loop-convert-negative.cpp?rev=246550&r1=246549&r2=246550&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-tidy/modernize-loop-convert-negative.cpp (original)
+++ clang-tools-extra/trunk/test/clang-tidy/modernize-loop-convert-negative.cpp Tue Sep  1 10:05:15 2015
@@ -3,91 +3,92 @@
 #include "structures.h"
 
 // CHECK-FIXES-NOT: for ({{.*[^:]:[^:].*}})
+// CHECK-MESSAGES-NOT: modernize-loop-convert
 
 namespace Negative {
 
 const int N = 6;
 int arr[N] = {1, 2, 3, 4, 5, 6};
 int (*pArr)[N] = &arr;
-int sum = 0;
+int Sum = 0;
 
-// Checks for the index start and end:
-void indexStartAndEnd() {
-  for (int i = 0; i < N + 1; ++i)
-    sum += arr[i];
+// Checks for the Index start and end:
+void IndexStartAndEnd() {
+  for (int I = 0; I < N + 1; ++I)
+    Sum += arr[I];
 
-  for (int i = 0; i < N - 1; ++i)
-    sum += arr[i];
+  for (int I = 0; I < N - 1; ++I)
+    Sum += arr[I];
 
-  for (int i = 1; i < N; ++i)
-    sum += arr[i];
+  for (int I = 1; I < N; ++I)
+    Sum += arr[I];
 
-  for (int i = 1; i < N; ++i)
-    sum += arr[i];
+  for (int I = 1; I < N; ++I)
+    Sum += arr[I];
 
-  for (int i = 0;; ++i)
-    sum += (*pArr)[i];
+  for (int I = 0;; ++I)
+    Sum += (*pArr)[I];
 }
 
 // Checks for invalid increment steps:
 void increment() {
-  for (int i = 0; i < N; --i)
-    sum += arr[i];
+  for (int I = 0; I < N; --I)
+    Sum += arr[I];
 
-  for (int i = 0; i < N; i)
-    sum += arr[i];
+  for (int I = 0; I < N; I)
+    Sum += arr[I];
 
-  for (int i = 0; i < N;)
-    sum += arr[i];
+  for (int I = 0; I < N;)
+    Sum += arr[I];
 
-  for (int i = 0; i < N; i += 2)
-    sum++;
+  for (int I = 0; I < N; I += 2)
+    Sum++;
 }
 
-// Checks to make sure that the index isn't used outside of the array:
-void indexUse() {
-  for (int i = 0; i < N; ++i)
-    arr[i] += 1 + i;
+// Checks to make sure that the Index isn't used outside of the array:
+void IndexUse() {
+  for (int I = 0; I < N; ++I)
+    arr[I] += 1 + I;
 }
 
 // Check for loops that don't mention arrays
 void noArray() {
-  for (int i = 0; i < N; ++i)
-    sum += i;
+  for (int I = 0; I < N; ++I)
+    Sum += I;
 
-  for (int i = 0; i < N; ++i) {
+  for (int I = 0; I < N; ++I) {
   }
 
-  for (int i = 0; i < N; ++i)
+  for (int I = 0; I < N; ++I)
     ;
 }
 
 // Checks for incorrect loop variables.
 void mixedVariables() {
   int badIndex;
-  for (int i = 0; badIndex < N; ++i)
-    sum += arr[i];
+  for (int I = 0; badIndex < N; ++I)
+    Sum += arr[I];
 
-  for (int i = 0; i < N; ++badIndex)
-    sum += arr[i];
+  for (int I = 0; I < N; ++badIndex)
+    Sum += arr[I];
 
-  for (int i = 0; badIndex < N; ++badIndex)
-    sum += arr[i];
+  for (int I = 0; badIndex < N; ++badIndex)
+    Sum += arr[I];
 
-  for (int i = 0; badIndex < N; ++badIndex)
-    sum += arr[badIndex];
+  for (int I = 0; badIndex < N; ++badIndex)
+    Sum += arr[badIndex];
 }
 
-// Checks for multiple arrays indexed.
+// Checks for multiple arrays Indexed.
 void multipleArrays() {
   int badArr[N];
 
-  for (int i = 0; i < N; ++i)
-    sum += arr[i] + badArr[i];
+  for (int I = 0; I < N; ++I)
+    Sum += arr[I] + badArr[I];
 
-  for (int i = 0; i < N; ++i) {
-    int k = badArr[i];
-    sum += arr[i] + k;
+  for (int I = 0; I < N; ++I) {
+    int K = badArr[I];
+    Sum += arr[I] + K;
   }
 }
 
@@ -99,22 +100,22 @@ struct HasArr {
 struct HasIndirectArr {
   HasArr HA;
   void implicitThis() {
-    for (int i = 0; i < N; ++i) {
-      printf("%d", HA.Arr[i]);
+    for (int I = 0; I < N; ++I) {
+      printf("%d", HA.Arr[I]);
     }
 
-    for (int i = 0; i < N; ++i) {
-      printf("%d", HA.ValArr[i].x);
+    for (int I = 0; I < N; ++I) {
+      printf("%d", HA.ValArr[I].x);
     }
   }
 
   void explicitThis() {
-    for (int i = 0; i < N; ++i) {
-      printf("%d", this->HA.Arr[i]);
+    for (int I = 0; I < N; ++I) {
+      printf("%d", this->HA.Arr[I]);
     }
 
-    for (int i = 0; i < N; ++i) {
-      printf("%d", this->HA.ValArr[i].x);
+    for (int I = 0; I < N; ++I) {
+      printf("%d", this->HA.ValArr[I].x);
     }
   }
 };
@@ -133,38 +134,38 @@ struct BadBeginEnd : T {
 
 void notBeginOrEnd() {
   BadBeginEnd Bad;
-  for (T::iterator i = Bad.notBegin(), e = Bad.end(); i != e; ++i)
-    int k = *i;
+  for (T::iterator I = Bad.notBegin(), E = Bad.end();  I != E; ++I)
+    int K = *I;
 
-  for (T::iterator i = Bad.begin(), e = Bad.notEnd(); i != e; ++i)
-    int k = *i;
+  for (T::iterator I = Bad.begin(), E = Bad.notEnd();  I != E; ++I)
+    int K = *I;
 }
 
 void badLoopShapes() {
-  for (T::iterator i = t.begin(), e = t.end(), f = e; i != e; ++i)
-    int k = *i;
+  for (T::iterator I = t.begin(), E = t.end(), F = E;  I != E; ++I)
+    int K = *I;
 
-  for (T::iterator i = t.begin(), e = t.end(); i != e;)
-    int k = *i;
+  for (T::iterator I = t.begin(), E = t.end();  I != E;)
+    int K = *I;
 
-  for (T::iterator i = t.begin(), e = t.end();; ++i)
-    int k = *i;
+  for (T::iterator I = t.begin(), E = t.end();; ++I)
+    int K = *I;
 
   T::iterator outsideI;
   T::iterator outsideE;
 
   for (; outsideI != outsideE; ++outsideI)
-    int k = *outsideI;
+    int K = *outsideI;
 }
 
 void iteratorArrayMix() {
   int lower;
   const int N = 6;
-  for (T::iterator i = t.begin(), e = t.end(); lower < N; ++i)
-    int k = *i;
+  for (T::iterator I = t.begin(), E = t.end(); lower < N; ++I)
+    int K = *I;
 
-  for (T::iterator i = t.begin(), e = t.end(); lower < N; ++lower)
-    int k = *i;
+  for (T::iterator I = t.begin(), E = t.end(); lower < N; ++lower)
+    int K = *I;
 }
 
 struct ExtraConstructor : T::iterator {
@@ -173,61 +174,77 @@ struct ExtraConstructor : T::iterator {
 };
 
 void badConstructor() {
-  for (T::iterator i = ExtraConstructor(t.begin(), 0), e = t.end();
-       i != e; ++i)
-    int k = *i;
-  for (T::iterator i = ExtraConstructor(t.begin()), e = t.end(); i != e; ++i)
-    int k = *i;
+  for (T::iterator I = ExtraConstructor(t.begin(), 0), E = t.end();
+        I != E; ++I)
+    int K = *I;
+  for (T::iterator I = ExtraConstructor(t.begin()), E = t.end();  I != E; ++I)
+    int K = *I;
+}
+
+void foo(S::iterator It) {}
+class Foo {public: void bar(S::iterator It); };
+Foo fo;
+
+void iteratorUsed() {
+  for (S::iterator I = s.begin(), E = s.end();  I != E; ++I)
+    foo(I);
+
+  for (S::iterator I = s.begin(), E = s.end();  I != E; ++I)
+    fo.bar(I);
+
+  S::iterator Ret;
+  for (S::iterator I = s.begin(), E = s.end();  I != E; ++I)
+    Ret = I;
 }
 
 void iteratorMemberUsed() {
-  for (T::iterator i = t.begin(), e = t.end(); i != e; ++i)
-    i.x = *i;
+  for (T::iterator I = t.begin(), E = t.end();  I != E; ++I)
+    I.x = *I;
 
-  for (T::iterator i = t.begin(), e = t.end(); i != e; ++i)
-    int k = i.x + *i;
+  for (T::iterator I = t.begin(), E = t.end();  I != E; ++I)
+    int K = I.x + *I;
 
-  for (T::iterator i = t.begin(), e = t.end(); i != e; ++i)
-    int k = e.x + *i;
+  for (T::iterator I = t.begin(), E = t.end();  I != E; ++I)
+    int K = E.x + *I;
 }
 
 void iteratorMethodCalled() {
-  for (T::iterator i = t.begin(), e = t.end(); i != e; ++i)
-    i.insert(3);
+  for (T::iterator I = t.begin(), E = t.end();  I != E; ++I)
+    I.insert(3);
 
-  for (T::iterator i = t.begin(), e = t.end(); i != e; ++i)
-    if (i != i)
-      int k = 3;
+  for (T::iterator I = t.begin(), E = t.end();  I != E; ++I)
+    if (I != I)
+      int K = 3;
 }
 
 void iteratorOperatorCalled() {
-  for (T::iterator i = t.begin(), e = t.end(); i != e; ++i)
-    int k = *(++i);
+  for (T::iterator I = t.begin(), E = t.end();  I != E; ++I)
+    int K = *(++I);
 
-  for (S::iterator i = s.begin(), e = s.end(); i != e; ++i)
-    MutableVal k = *(++i);
+  for (S::iterator I = s.begin(), E = s.end();  I != E; ++I)
+    MutableVal K = *(++I);
 }
 
 void differentContainers() {
   T other;
-  for (T::iterator i = t.begin(), e = other.end(); i != e; ++i)
-    int k = *i;
+  for (T::iterator I = t.begin(), E = other.end();  I != E; ++I)
+    int K = *I;
 
-  for (T::iterator i = other.begin(), e = t.end(); i != e; ++i)
-    int k = *i;
+  for (T::iterator I = other.begin(), E = t.end();  I != E; ++I)
+    int K = *I;
 
   S otherS;
-  for (S::iterator i = s.begin(), e = otherS.end(); i != e; ++i)
-    MutableVal k = *i;
+  for (S::iterator I = s.begin(), E = otherS.end();  I != E; ++I)
+    MutableVal K = *I;
 
-  for (S::iterator i = otherS.begin(), e = s.end(); i != e; ++i)
-    MutableVal k = *i;
+  for (S::iterator I = otherS.begin(), E = s.end();  I != E; ++I)
+    MutableVal K = *I;
 }
 
 void wrongIterators() {
   T::iterator other;
-  for (T::iterator i = t.begin(), e = t.end(); i != other; ++i)
-    int k = *i;
+  for (T::iterator I = t.begin(), E = t.end(); I != other; ++I)
+    int K = *I;
 }
 
 struct EvilArrow : U {
@@ -237,10 +254,10 @@ struct EvilArrow : U {
 
 void differentMemberAccessTypes() {
   EvilArrow A;
-  for (EvilArrow::iterator i = A.begin(), e = A->end(); i != e; ++i)
-    Val k = *i;
-  for (EvilArrow::iterator i = A->begin(), e = A.end(); i != e; ++i)
-    Val k = *i;
+  for (EvilArrow::iterator I = A.begin(), E = A->end();  I != E; ++I)
+    Val K = *I;
+  for (EvilArrow::iterator I = A->begin(), E = A.end();  I != E; ++I)
+    Val K = *I;
 }
 
 void f(const T::iterator &it, int);
@@ -248,21 +265,21 @@ void f(const T &it, int);
 void g(T &it, int);
 
 void iteratorPassedToFunction() {
-  for (T::iterator i = t.begin(), e = t.end(); i != e; ++i)
-    f(i, *i);
+  for (T::iterator I = t.begin(), E = t.end();  I != E; ++I)
+    f(I, *I);
 }
 
 // FIXME: These tests can be removed if this tool ever does enough analysis to
 // decide that this is a safe transformation. Until then, we don't want it
 // applied.
 void iteratorDefinedOutside() {
-  T::iterator theEnd = t.end();
-  for (T::iterator i = t.begin(); i != theEnd; ++i)
-    int k = *i;
-
-  T::iterator theBegin = t.begin();
-  for (T::iterator e = t.end(); theBegin != e; ++theBegin)
-    int k = *theBegin;
+  T::iterator TheEnd = t.end();
+  for (T::iterator I = t.begin(); I != TheEnd; ++I)
+    int K = *I;
+
+  T::iterator TheBegin = t.begin();
+  for (T::iterator E = t.end(); TheBegin != E; ++TheBegin)
+    int K = *TheBegin;
 }
 
 } // namespace NegativeIterator
@@ -274,102 +291,102 @@ dependent<int> v;
 dependent<int> *pv;
 
 transparent<dependent<int>> cv;
-int sum = 0;
+int Sum = 0;
 
-// Checks for the index start and end:
-void indexStartAndEnd() {
-  for (int i = 0; i < v.size() + 1; ++i)
-    sum += v[i];
+// Checks for the Index start and end:
+void IndexStartAndEnd() {
+  for (int I = 0; I < v.size() + 1; ++I)
+    Sum += v[I];
 
-  for (int i = 0; i < v.size() - 1; ++i)
-    sum += v[i];
+  for (int I = 0; I < v.size() - 1; ++I)
+    Sum += v[I];
 
-  for (int i = 1; i < v.size(); ++i)
-    sum += v[i];
+  for (int I = 1; I < v.size(); ++I)
+    Sum += v[I];
 
-  for (int i = 1; i < v.size(); ++i)
-    sum += v[i];
+  for (int I = 1; I < v.size(); ++I)
+    Sum += v[I];
 
-  for (int i = 0;; ++i)
-    sum += (*pv)[i];
+  for (int I = 0;; ++I)
+    Sum += (*pv)[I];
 }
 
 // Checks for invalid increment steps:
 void increment() {
-  for (int i = 0; i < v.size(); --i)
-    sum += v[i];
+  for (int I = 0; I < v.size(); --I)
+    Sum += v[I];
 
-  for (int i = 0; i < v.size(); i)
-    sum += v[i];
+  for (int I = 0; I < v.size(); I)
+    Sum += v[I];
 
-  for (int i = 0; i < v.size();)
-    sum += v[i];
+  for (int I = 0; I < v.size();)
+    Sum += v[I];
 
-  for (int i = 0; i < v.size(); i += 2)
-    sum++;
+  for (int I = 0; I < v.size(); I += 2)
+    Sum++;
 }
 
-// Checks to make sure that the index isn't used outside of the container:
-void indexUse() {
-  for (int i = 0; i < v.size(); ++i)
-    v[i] += 1 + i;
+// Checks to make sure that the Index isn't used outside of the container:
+void IndexUse() {
+  for (int I = 0; I < v.size(); ++I)
+    v[I] += 1 + I;
 }
 
 // Checks for incorrect loop variables.
 void mixedVariables() {
   int badIndex;
-  for (int i = 0; badIndex < v.size(); ++i)
-    sum += v[i];
+  for (int I = 0; badIndex < v.size(); ++I)
+    Sum += v[I];
 
-  for (int i = 0; i < v.size(); ++badIndex)
-    sum += v[i];
+  for (int I = 0; I < v.size(); ++badIndex)
+    Sum += v[I];
 
-  for (int i = 0; badIndex < v.size(); ++badIndex)
-    sum += v[i];
+  for (int I = 0; badIndex < v.size(); ++badIndex)
+    Sum += v[I];
 
-  for (int i = 0; badIndex < v.size(); ++badIndex)
-    sum += v[badIndex];
+  for (int I = 0; badIndex < v.size(); ++badIndex)
+    Sum += v[badIndex];
 }
 
-// Checks for an array indexed in addition to the container.
+// Checks for an array Indexed in addition to the container.
 void multipleArrays() {
   int badArr[N];
 
-  for (int i = 0; i < v.size(); ++i)
-    sum += v[i] + badArr[i];
+  for (int I = 0; I < v.size(); ++I)
+    Sum += v[I] + badArr[I];
 
-  for (int i = 0; i < v.size(); ++i)
-    sum += badArr[i];
+  for (int I = 0; I < v.size(); ++I)
+    Sum += badArr[I];
 
-  for (int i = 0; i < v.size(); ++i) {
-    int k = badArr[i];
-    sum += k + 2;
+  for (int I = 0; I < v.size(); ++I) {
+    int K = badArr[I];
+    Sum += K + 2;
   }
 
-  for (int i = 0; i < v.size(); ++i) {
-    int k = badArr[i];
-    sum += v[i] + k;
+  for (int I = 0; I < v.size(); ++I) {
+    int K = badArr[I];
+    Sum += v[I] + K;
   }
 }
 
-// Checks for multiple containers being indexed container.
+// Checks for multiple containers being Indexed container.
 void multipleContainers() {
   dependent<int> badArr;
 
-  for (int i = 0; i < v.size(); ++i)
-    sum += v[i] + badArr[i];
+  for (int I = 0; I < v.size(); ++I)
+    Sum += v[I] + badArr[I];
 
-  for (int i = 0; i < v.size(); ++i)
-    sum += badArr[i];
+  for (int I = 0; I < v.size(); ++I)
+    Sum += badArr[I];
 
-  for (int i = 0; i < v.size(); ++i) {
-    int k = badArr[i];
-    sum += k + 2;
+  for (int I = 0; I < v.size(); ++I) {
+    int K = badArr[I];
+    Sum += K + 2;
   }
 
-  for (int i = 0; i < v.size(); ++i) {
-    int k = badArr[i];
-    sum += v[i] + k;
+  for (int I = 0; I < v.size(); ++I) {
+    int K = badArr[I];
+    Sum += v[I] + K;
   }
 }
 
@@ -377,31 +394,31 @@ void multipleContainers() {
 void derefContainer() {
   // Note the dependent<T>::operator*() returns another dependent<T>.
   // This test makes sure that we don't allow an arbitrary number of *'s.
-  for (int i = 0; i < pv->size(); ++i)
-    sum += (**pv).at(i);
+  for (int I = 0; I < pv->size(); ++I)
+    Sum += (**pv).at(I);
 
-  for (int i = 0; i < pv->size(); ++i)
-    sum += (**pv)[i];
+  for (int I = 0; I < pv->size(); ++I)
+    Sum += (**pv)[I];
 }
 
 void wrongEnd() {
-  int bad;
-  for (int i = 0, e = v.size(); i < bad; ++i)
-    sum += v[i];
+  int Bad;
+  for (int I = 0, E = v.size(); I < Bad; ++I)
+    Sum += v[I];
 }
 
 // Checks to see that non-const member functions are not called on the container
 // object.
 // These could be conceivably allowed with a lower required confidence level.
 void memberFunctionCalled() {
-  for (int i = 0; i < v.size(); ++i) {
-    sum += v[i];
+  for (int I = 0; I < v.size(); ++I) {
+    Sum += v[I];
     v.foo();
   }
 
-  for (int i = 0; i < v.size(); ++i) {
-    sum += v[i];
-    dependent<int>::iterator it = v.begin();
+  for (int I = 0; I < v.size(); ++I) {
+    Sum += v[I];
+    dependent<int>::iterator It = v.begin();
   }
 }
 
@@ -419,39 +436,39 @@ void f(T);
 
 void complexContainer() {
   X x;
-  for (S::iterator i = x.s.begin(), e = x.s.end(); i != e; ++i) {
+  for (S::iterator I = x.s.begin(), E = x.s.end();  I != E; ++I) {
     f(x);
-    MutableVal k = *i;
+    MutableVal K = *I;
   }
 
-  for (T::iterator i = x.t.begin(), e = x.t.end(); i != e; ++i) {
+  for (T::iterator I = x.t.begin(), E = x.t.end();  I != E; ++I) {
     f(x);
-    int k = *i;
+    int K = *I;
   }
 
-  for (S::iterator i = x.s.begin(), e = x.s.end(); i != e; ++i) {
+  for (S::iterator I = x.s.begin(), E = x.s.end();  I != E; ++I) {
     f(x.s);
-    MutableVal k = *i;
+    MutableVal K = *I;
   }
 
-  for (T::iterator i = x.t.begin(), e = x.t.end(); i != e; ++i) {
+  for (T::iterator I = x.t.begin(), E = x.t.end();  I != E; ++I) {
     f(x.t);
-    int k = *i;
+    int K = *I;
   }
 
-  for (S::iterator i = x.getS().begin(), e = x.getS().end(); i != e; ++i) {
+  for (S::iterator I = x.getS().begin(), E = x.getS().end();  I != E; ++I) {
     f(x.getS());
-    MutableVal k = *i;
+    MutableVal K = *I;
   }
 
-  X exes[5];
-  int index = 0;
+  X Exes[5];
+  int Index = 0;
 
-  for (S::iterator i = exes[index].getS().begin(),
-                   e = exes[index].getS().end();
-       i != e; ++i) {
-    index++;
-    MutableVal k = *i;
+  for (S::iterator I = Exes[Index].getS().begin(),
+                   E = Exes[Index].getS().end();
+        I != E; ++I) {
+    Index++;
+    MutableVal K = *I;
   }
 }
 




More information about the cfe-commits mailing list