[modules] Reconstruct template default argument inheritance on reload rather

than wasting storage and triggering eager deserializations by serializing it.

llvm-svn: 239454
This commit is contained in:
Richard Smith
2015-06-10 01:47:58 +00:00
parent 4881e8b239
commit 8346e52f89
2 changed files with 57 additions and 29 deletions

View File

@@ -1380,10 +1380,11 @@ void ASTDeclWriter::VisitTemplateTypeParmDecl(TemplateTypeParmDecl *D) {
VisitTypeDecl(D);
Record.push_back(D->wasDeclaredWithTypename());
Record.push_back(D->defaultArgumentWasInherited());
if (D->defaultArgumentWasInherited())
Writer.AddDeclRef(D->getDefaultArgStorage().getInheritedFrom(), Record);
else
bool OwnsDefaultArg = D->hasDefaultArgument() &&
!D->defaultArgumentWasInherited();
Record.push_back(OwnsDefaultArg);
if (OwnsDefaultArg)
Writer.AddTypeSourceInfo(D->getDefaultArgumentInfo(), Record);
Code = serialization::DECL_TEMPLATE_TYPE_PARM;
@@ -1411,10 +1412,10 @@ void ASTDeclWriter::VisitNonTypeTemplateParmDecl(NonTypeTemplateParmDecl *D) {
} else {
// Rest of NonTypeTemplateParmDecl.
Record.push_back(D->isParameterPack());
Record.push_back(D->defaultArgumentWasInherited());
if (D->defaultArgumentWasInherited())
Writer.AddDeclRef(D->getDefaultArgStorage().getInheritedFrom(), Record);
else
bool OwnsDefaultArg = D->hasDefaultArgument() &&
!D->defaultArgumentWasInherited();
Record.push_back(OwnsDefaultArg);
if (OwnsDefaultArg)
Writer.AddStmt(D->getDefaultArgument());
Code = serialization::DECL_NON_TYPE_TEMPLATE_PARM;
}
@@ -1441,10 +1442,10 @@ void ASTDeclWriter::VisitTemplateTemplateParmDecl(TemplateTemplateParmDecl *D) {
} else {
// Rest of TemplateTemplateParmDecl.
Record.push_back(D->isParameterPack());
Record.push_back(D->defaultArgumentWasInherited());
if (D->defaultArgumentWasInherited())
Writer.AddDeclRef(D->getDefaultArgStorage().getInheritedFrom(), Record);
else
bool OwnsDefaultArg = D->hasDefaultArgument() &&
!D->defaultArgumentWasInherited();
Record.push_back(OwnsDefaultArg);
if (OwnsDefaultArg)
Writer.AddTemplateArgumentLoc(D->getDefaultArgument(), Record);
Code = serialization::DECL_TEMPLATE_TEMPLATE_PARM;
}