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.
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.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits