================ @@ -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:
In `ASTImporter` there is currently no distinction about what can be imported with the `import` functions. They should work with any object. The caller should ensure that the imported objects are processed correctly (added to something already existing or used to import a bigger object). 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