[clang-tools-extra] [clang-tidy] readability-redundant-smartptr-get: disable for smart pointers to arrays (PR #141092)

kadir çetinkaya via cfe-commits cfe-commits at lists.llvm.org
Mon May 26 15:07:01 PDT 2025


================
@@ -43,10 +43,18 @@ internal::Matcher<Expr> callToGet(const internal::Matcher<Decl> &OnClass) {
       .bind("redundant_get");
 }
 
-internal::Matcher<Decl> knownSmartptr() {
+internal::Matcher<Decl> knownSmartptrAny() {
   return recordDecl(hasAnyName("::std::unique_ptr", "::std::shared_ptr"));
 }
 
+internal::Matcher<Decl> knownSmartptrNonArray() {
+  return recordDecl(hasAnyName("::std::unique_ptr", "::std::shared_ptr"),
+                    anyOf(has(cxxMethodDecl(hasName("operator*"))),
+                          has(functionTemplateDecl(hasName("operator*")))),
----------------
kadircet wrote:

this is kind of nit-picky, so feel free to land as-is, but ...

ugh it's annoying that default matchers don't handle function-template-decls. I think we can still move this into function below, with something like:

```cpp
  auto MatchesOpArrow =
      allOf(hasName("operator->"),
            returns(qualType(pointsTo(type().bind("op->Type")))));
  auto MatchesOpStar =
      allOf(hasName("operator*"),
            returns(qualType(references(type().bind("op*Type")))));
  const auto HasRelevantOps =
      allOf(anyOf(hasMethod(MatchesOpArrow),
                  has(functionTemplateDecl(has(functionDecl(MatchesOpArrow))))),
            anyOf(hasMethod(MatchesOpStar),
                  has(functionTemplateDecl(has(functionDecl(MatchesOpStar))))));
  const auto QuacksLikeASmartptr =
      cxxRecordDecl(cxxRecordDecl().bind("duck_typing"), HasRelevantOps);
```

That way we can also improve `duck_typing` to cover those weird templated cases, while spelling names once.

Later on in the relevant matchers can be expanded with `allOf(..., HasRelevantOps)`

https://github.com/llvm/llvm-project/pull/141092


More information about the cfe-commits mailing list