[PATCH] D61827: [clang-tidy] modernize-loop-convert: impl const cast iter

Torbjörn Klatt via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Sat May 11 12:19:03 PDT 2019


torbjoernk created this revision.
torbjoernk added reviewers: dergachev.a, hintonda, alexfh.
torbjoernk added a project: clang-tools-extra.
Herald added subscribers: cfe-commits, xazax.hun.
Herald added a project: clang.

modernize-loop-convert was not detecting implicit casts to
const_iterator as convertible to range-based loops:

  std::vector<int> vec{1,2,3,4}
  for(std::vector<int>::const_iterator i = vec.begin();
      i != vec.end();
      ++i) { }

Thanks to Don Hinton for advice on cfe-dev.

Also simplify AST matcher for matching iterator-based loops.

Thanks to Artem Dergachev for spotting it on cfe-dev.

Fixes PR#35082


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D61827

Files:
  clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp
  clang-tools-extra/test/clang-tidy/modernize-loop-convert-basic.cpp


Index: clang-tools-extra/test/clang-tidy/modernize-loop-convert-basic.cpp
===================================================================
--- clang-tools-extra/test/clang-tidy/modernize-loop-convert-basic.cpp
+++ clang-tools-extra/test/clang-tidy/modernize-loop-convert-basic.cpp
@@ -270,6 +270,13 @@
   // CHECK-FIXES: for (auto & P : *Ps)
   // CHECK-FIXES-NEXT: printf("s has value %d\n", P.X);
 
+  for (S::const_iterator It = Ss.begin(), E = Ss.end(); 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 It : Ss)
+  // CHECK-FIXES-NEXT: printf("s has value %d\n", It.X);
+
   for (S::const_iterator It = Ss.cbegin(), E = Ss.cend(); It != E; ++It) {
     printf("s has value %d\n", (*It).X);
   }
Index: clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp
+++ clang-tools-extra/clang-tidy/modernize/LoopConvertCheck.cpp
@@ -128,10 +128,7 @@
           .bind(BeginCallName);
 
   DeclarationMatcher InitDeclMatcher =
-      varDecl(hasInitializer(anyOf(ignoringParenImpCasts(BeginCallMatcher),
-                                   materializeTemporaryExpr(
-                                       ignoringParenImpCasts(BeginCallMatcher)),
-                                   hasDescendant(BeginCallMatcher))))
+      varDecl(hasInitializer(hasDescendant(BeginCallMatcher)))
           .bind(InitVarName);
 
   DeclarationMatcher EndDeclMatcher =
@@ -791,11 +788,6 @@
               CanonicalBeginType->getPointeeType(),
               CanonicalInitVarType->getPointeeType()))
         return false;
-    } else if (!Context->hasSameType(CanonicalInitVarType,
-                                     CanonicalBeginType)) {
-      // Check for qualified types to avoid conversions from non-const to const
-      // iterator types.
-      return false;
     }
   } else if (FixerKind == LFK_PseudoArray) {
     // This call is required to obtain the container.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D61827.199153.patch
Type: text/x-patch
Size: 2123 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190511/e8b1dbfc/attachment.bin>


More information about the cfe-commits mailing list