[clang] [clang][ASTImporter] New fix for default template parameter values. (PR #101836)
Balázs Kéri via cfe-commits
cfe-commits at lists.llvm.org
Wed Aug 21 09:12:24 PDT 2024
================
@@ -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
More information about the cfe-commits
mailing list