================
@@ -9180,6 +9180,12 @@ bool Sema::hasAcceptableDefinition(NamedDecl *D, 
NamedDecl **Suggested,
   if (!getLangOpts().Modules && !getLangOpts().ModulesLocalVisibility)
     return true;
 
+  // The external source may have additional definitions of this entity that 
are
+  // visible, so complete the redeclaration chain now.
+  if (auto *Source = Context.getExternalSource()) {
+    Source->CompleteRedeclChain(D);
+  }
----------------
mpark wrote:

Yeah, I agree. I'm kind of trying to figure out what the most recent pattern 
(😂) is for most recent decls.

Some options I've come across are:

1. `CompleteRedeclChain` if `getExternalSource()` is present. e.g. 
[SemaType.cpp](https://github.com/llvm/llvm-project/blob/release/20.x/clang/lib/Sema/SemaType.cpp#L9225-L9230)
 (current state of the PR)
```cpp
  // The external source may have additional definitions of this entity that are
  // visible, so complete the redeclaration chain now.
  if (auto *Source = Context.getExternalSource()) {
    Source->CompleteRedeclChain(D);
  }
```

2. "Dummy" invocation of `getMostRecentDecl()` if `getExternalSource()` is 
present. e.g. 
[DeclBase.cpp](https://github.com/llvm/llvm-project/blob/release/20.x/clang/lib/AST/DeclBase.cpp#L1884-L1889)
```cpp
  // If we have an external source, ensure that any later redeclarations of this
  // context have been loaded, since they may add names to the result of this
  // lookup (or add external visible storage).
  ExternalASTSource *Source = getParentASTContext().getExternalSource();
  if (Source)
    (void)cast<Decl>(this)->getMostRecentDecl();
```

3. Unconditional "dummy" invocation of `getMostRecentDecl()`. e.g. 
[CXXRecordDecl::dataPtr](https://github.com/llvm/llvm-project/blob/release/20.x/clang/include/clang/AST/DeclCXX.h#L457-L461)
 and 
[RecordLayoutBuilder.cpp](https://github.com/llvm/llvm-project/blob/release/20.x/clang/lib/AST/RecordLayoutBuilder.cpp#L3329-L3330)

I'm not quite sure I fully understood what you meant by:
> I feel better to do this in redecls.

We don't need to iterate through the `redecls()` here, and while I see dummy 
invocations of `getMostRecentDecl` as a way to trigger redecl completion, I 
don't see examples of `redecls` being called to force that to happen.

https://github.com/llvm/llvm-project/pull/129982
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to