[PATCH] D20196: [clang-tidy] Inefficient string operation

Alexander Kornienko via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 4 05:32:18 PDT 2016


alexfh added inline comments.

================
Comment at: clang-tidy/performance/InefficientStringConcatenationCheck.cpp:50
@@ +49,3 @@
+      hasOverloadedOperatorName("="), hasDescendant(BasicStringPlusOperator),
+      allOf(hasArgument(
+                0, allOf(declRefExpr(BasicStringType),
----------------
1. No need for `allOf`, node matchers are implicitly "all of".
2. `hasDescendant()` is potentially the most expensive part here and should go after all other constraints.

================
Comment at: clang-tidy/performance/InefficientStringConcatenationCheck.cpp:68
@@ +67,3 @@
+        this);
+  }
+}
----------------
For 1: if `hasAncestor(anyOf(cxxForRangeStmt(), ...))` doesn't work, you can try `hasAncestor(stmt(anyOf(cxxForRangeStmt(), ...))`. In any case, repeated `hasAncestor` matchers don't make the check faster ;)

For 2: `exprWithCleanups` and other implicit nodes can be skipped using the `ignoringImplicit()` matchers. Leave `hasAncestor` for the cases, where there can actually be arbitrary nodes in the path.

Here you're matching some arbitrary intermediate node (`exprWithCleanups`) and then you're constraining its parents and its children. This doesn't make much sense and it's rather inefficient. Since you're interested in the operators in the first place, try rearranging the matcher like this: 
```
cxxOperatorCallExpr(
  anyOf(AssignOperator, PlusOperator),
  hasAncestor(stmt(anyOf(cxxForRangeStmt(), whileStmt(), forStmt()))))
```


http://reviews.llvm.org/D20196





More information about the cfe-commits mailing list