[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:21:35 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:
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
More information about the cfe-commits
mailing list