================ @@ -5968,11 +5962,21 @@ ASTNodeImporter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) { } if (D->hasDefaultArgument()) { + // Default argument can be "inherited" when it has a reference to the + // previous declaration (of the default argument) which is stored only once. + // Here we import the default argument in any case, and the inherited state + // is updated later after the parent template was created. If the + // inherited-from object would be imported here it causes more difficulties + // (parent template may not be created yet and import loops can occur). Expected<TemplateArgumentLoc> ToDefaultArgOrErr = import(D->getDefaultArgument()); if (!ToDefaultArgOrErr) return ToDefaultArgOrErr.takeError(); - ToD->setDefaultArgument(ToD->getASTContext(), *ToDefaultArgOrErr); + // The just called import process can trigger import of the parent template + // which can update the default argument value to "inherited". This should + // not be changed. + if (!ToD->hasDefaultArgument()) + ToD->setDefaultArgument(ToD->getASTContext(), *ToDefaultArgOrErr); ---------------- balazske wrote:
The order of objects (or the declaration chain) after the import can be different than the original order, probably for any `Decl`. This is because declarations have often recursive or circular references to each other. I think this is true for templates too (and the "templated" declarations in the templates). The redeclarations are imported all the time currently, only if a definition is imported it is mapped to an existing definition if possible. It was an old decision to not merge any (non-definition) declarations at import because it creates only even more difficulties. https://github.com/llvm/llvm-project/pull/101836 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits