================ @@ -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:
So the issue has to do with `ClassTemplateDecl`, `ClassTemplateSpecializationDecl`, and `CXXRecordDecl`. I'll describe my observations in the problematic invocation of `hasAcceptableDefinition`. I believe there are 4 relevant pieces here: 1. `ClassTemplateSpecializationDecl` for `BS<Empty<int>>` 2. `CXXRecordDecl` for `BS<Empty<int>>` (base portion of (1)) 3. `ClassTemplateDecl` for `BS<T>` 4. `CXXRecordDecl` for `BS<T>` `NamedDecl* D` coming into `hasAcceptableDefinition` points to a `NamedDecl` base portion of `ClassTemplateSpecializationDecl` for `BS<Empty<int>>` [1]. `auto* RD = dyn_cast<CXXRecordDecl>(D)` is the `CXXRecordDecl` portion of `BS<Empty<int>>` [2]. `auto *Pattern = RD->getTemplateInstantiationPattern()` is an instance of `CXXRecordDecl` for `BS<T>` [4]. Whatever the reason, at this point the *definition* of [4] has not been loaded yet. I would've expected that the call to `RD->getDefinition()` (which has a dummy invocation to `getMostRecentDecl()` under the hood) should load the definition, but this does not happen for some reason. However, calling `getMostRecentDecl()` on any of [1], [2] or [3] have the desired effect of loading the definition of [4]... e.g. `RD->getMostRecentDecl()` calls it on [2] which loads the definition of [4], and `Pattern->getDescribedClassTemplate()->getMostRecentDecl()` calls it on [3] which also gives us the definition of [4] we're looking for... The current solution here effectively is to call `getMostRecentDecl` on [2] such that it loads the redecl chain which somehow includes the definition of [4]... but maybe the real solution is to figure out why the `getMostRecentDecl` call on [4] itself doesn't load the corresponding definition? 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