[PATCH] D114949: [clangd] IncludeCleaner: Do not require forward declarations of RecordDecls when definition is available

Kadir Cetinkaya via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Dec 2 06:33:23 PST 2021


kadircet added inline comments.


================
Comment at: clang-tools-extra/clangd/IncludeCleaner.cpp:151
+      if (SM.isInMainFile(RD->getMostRecentDecl()->getLocation())) {
+        if (Definition)
           Result.insert(Definition->getLocation());
----------------
if we made it here, we already know definition wasn't visible in the current TU.

maybe just something like:

```
// Special case RecordDecls, as it is common for them to be forward declared multiple times.
// The most common two cases are:
// - definition available in TU, only mark that one as usage. rest is likely to be unnecessary. this might result in false positives when an internal definition is visible.
// - there's a forward declaration in the main file, no need for other redecls.
if (auto *RD = ...) {
  if (auto *Def) {
    insert that;
    return;
  }
  if (mostRecentInMainFile) {
    return;
  }
}
```

If we really want to keep a note around nested decls, we might say something like:
`Forward decls/definitions of nested recorddecls can only be nested inside other recorddecls, and the definition for outer recorddecl has to be visible, and we always preserve definitions.`

But I don't think all the additional information provides much value, rather creates confusion and forces one to think more about the details.


================
Comment at: clang-tools-extra/clangd/unittests/IncludeCleanerTests.cpp:67
       {
-          "namespace ns { struct ^X; struct ^X {}; }",
+          "namespace ns { struct X; struct ^X {}; }",
           "using ns::X;",
----------------
you mind changing these into functions as well?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D114949



More information about the cfe-commits mailing list