[PATCH] D140095: [include-cleaner] Fix the member-expr-access usage for sugar type.

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Dec 15 06:54:38 PST 2022


sammccall added inline comments.


================
Comment at: clang-tools-extra/include-cleaner/lib/WalkAST.cpp:50
+      return UT->getFoundDecl();
+    if (const auto *TST = Type->getAs<TemplateSpecializationType>())
+      return resolveTemplateName(TST->getTemplateName());
----------------
Resolving a template type to only its template name (ignoring template args) seems dubious in general. `Foo` is an important part of `vector<Foo>` and a critical part of `unique_ptr<Foo>`.

Currently we're only using this for the base types of MemberExpr, and here what we really care about is: which decl is responsible for this member? For this, the template (as opposed to args) is a reasonable heuristic. The exceptions I can think of:

 - dependent base: `template <class T> class Wrapper : public T {};` - this is rare I think
 - type aliases: `template <class T> using raw_pointer = T*;`
 - smart pointers (non-exception): `unique_ptr<T>`: the base of the member expr ends up being `T*` at least in non-dependent cases, so we're fine

So I'd suggest:
 - renaming this function to `getMemberProvider(QualType Base)` or so
 - adding a comment explicitly stating that the template name rather than params generally provide the members


================
Comment at: clang-tools-extra/include-cleaner/lib/WalkAST.cpp:66
     // A member expr implies a usage of the class type
     // (e.g., to prevent inserting a header of base class when using base
     // members from a derived object).
----------------
this comment is confusing: it suggests that reporting a usage preverts inserting a header!
Would be nice to clarify:
 - we report a usage so that code `returnFoo().bar` can keep `#include "foo.h"`
 - reporting the member decl would cause problems (inheritance, aliases)


================
Comment at: clang-tools-extra/include-cleaner/lib/WalkAST.cpp:70
     QualType Type = E->getBase()->IgnoreImpCasts()->getType();
     report(E->getMemberLoc(), resolveType(Type));
     return true;
----------------
only tangentially related, but should these be implicit references?

I don't think we actually want to insert headers based on them, right? Just allow people to keep the ones that they have inserted that are required for compilation?

This would also make it less severe if our heuristic above goes wrong.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D140095/new/

https://reviews.llvm.org/D140095



More information about the cfe-commits mailing list