[PATCH] D12797: Refactor LoopConvertCheck.

Manuel Klimek via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 14 15:55:59 PDT 2015


klimek added inline comments.

================
Comment at: clang-tidy/modernize/LoopConvertCheck.cpp:419
@@ +418,3 @@
+  // assumption the user is trying to modernize their codebase.
+  if (getLangOpts().CPlusPlus) {
+    Finder->addMatcher(makeArrayLoopMatcher(), this);
----------------
Now you can make that early exit!

================
Comment at: clang-tidy/modernize/LoopConvertCheck.cpp:494-495
@@ -493,4 +502,2 @@
     } else {
-      if (Descriptor.DerefByConstRef)
-        AutoRefType = Context->getConstType(AutoRefType);
       AutoRefType = Context->getLValueReferenceType(AutoRefType);
----------------
I assume the change in the tests is due to the bug here? :)

================
Comment at: clang-tidy/modernize/LoopConvertCheck.cpp:497
@@ +496,3 @@
+    if (Descriptor.DerefByConstRef) {
+      AutoRefType = Context->getConstType(AutoRefType);
+      AutoRefType = Context->getLValueReferenceType(AutoRefType);
----------------
I'd give the intermediate result a different name.

================
Comment at: clang-tidy/modernize/LoopConvertCheck.cpp:540
@@ -566,5 +539,3 @@
 
-  Confidence ConfidenceLevel(Finder.getConfidenceLevel());
-  if (FixerKind == LFK_Array) {
-    // The array being indexed by IndexVar was discovered during traversal.
-    ContainerExpr = Finder.getContainerIndexed()->IgnoreParenImpCasts();
+  if (FixerKind == LFK_Iterator) {
+    // The iterator loops provides bound nodes to obtain this information.
----------------
I think we still want to split up this function. The if() {} else {} blocks are too long ...

================
Comment at: clang-tidy/modernize/LoopConvertCheck.cpp:541
@@ +540,3 @@
+  if (FixerKind == LFK_Iterator) {
+    // The iterator loops provides bound nodes to obtain this information.
+    const auto *InitVar = Nodes.getDeclAs<VarDecl>(InitVarName);
----------------
This sentence doesn't parse.

================
Comment at: clang-tidy/modernize/LoopConvertCheck.cpp:549-551
@@ +548,5 @@
+    if (Descriptor.DerefByValue) {
+      // If the dereference operator returns by value then test for the
+      // canonical const qualification of the init variable type.
+      // TODO: Think about this.
+      Descriptor.DerefByConstRef = CanonicalInitVarType.isConstQualified();
----------------
I think an example might help this comment. Here and elsewhere ;)

================
Comment at: clang-tidy/modernize/LoopConvertCheck.cpp:551
@@ +550,3 @@
+      // canonical const qualification of the init variable type.
+      // TODO: Think about this.
+      Descriptor.DerefByConstRef = CanonicalInitVarType.isConstQualified();
----------------
LLVM uses FIXME; also, "Think about this" is not a good todo ;) They need to be more specific (or delete it).

================
Comment at: clang-tidy/modernize/LoopConvertCheck.cpp:580
@@ -581,1 +579,3 @@
+    if (usagesAreConst(Usages)) {
+      // If we can add a const, just do it.
       Descriptor.DerefByConstRef = true;
----------------
That comment doesn't give information, I think. I'd delete it.

================
Comment at: clang-tidy/modernize/LoopConvertCheck.cpp:584-585
@@ -593,1 +583,4 @@
+      if (usagesReturnRValues(Usages)) {
+        // If the index usages (dereference, subscript, at, ...) return rvalues,
+        // then we should not use a reference.
         Descriptor.DerefByValue = true;
----------------
Perhaps add: , because we need to keep the code correct if it mutates the returned objects

================
Comment at: clang-tidy/modernize/LoopConvertCheck.cpp:590
@@ -596,8 +589,3 @@
         for (const Usage &U : Usages) {
-          if (!U.Expression || U.Expression->getType().isNull())
-            continue;
-          QualType Type = U.Expression->getType().getCanonicalType();
-          if (U.Kind == Usage::UK_MemberThroughArrow) {
-            if (!Type->isPointerType())
-              continue;
-            Type = Type->getPointeeType();
+          if (U.Expression && !U.Expression->getType().isNull()) {
+            QualType Type = U.Expression->getType().getCanonicalType();
----------------
I liked the early continue better...

================
Comment at: clang-tidy/modernize/LoopConvertCheck.h:34
@@ -32,2 +33,3 @@
     bool IsTriviallyCopyable;
+    StringRef ContainerString;
   };
----------------
I'd probably make that a std::string - having references in members is a frequent cause for bugs.


http://reviews.llvm.org/D12797





More information about the cfe-commits mailing list