diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/AST/DeclTemplate.cpp')
-rwxr-xr-x | contrib/llvm-project/clang/lib/AST/DeclTemplate.cpp | 77 |
1 files changed, 52 insertions, 25 deletions
diff --git a/contrib/llvm-project/clang/lib/AST/DeclTemplate.cpp b/contrib/llvm-project/clang/lib/AST/DeclTemplate.cpp index 7857e75f57a1..25235c56ec46 100755 --- a/contrib/llvm-project/clang/lib/AST/DeclTemplate.cpp +++ b/contrib/llvm-project/clang/lib/AST/DeclTemplate.cpp @@ -102,24 +102,10 @@ unsigned TemplateParameterList::getMinRequiredArguments() const { unsigned NumRequiredArgs = 0; for (const NamedDecl *P : asArray()) { if (P->isTemplateParameterPack()) { - if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P)) { - if (NTTP->isExpandedParameterPack()) { - NumRequiredArgs += NTTP->getNumExpansionTypes(); - continue; - } - } else if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(P)) { - if (TTP->isExpandedParameterPack()) { - NumRequiredArgs += TTP->getNumExpansionParameters(); - continue; - } - } else { - const auto *TP = cast<TemplateTemplateParmDecl>(P); - if (TP->isExpandedParameterPack()) { - NumRequiredArgs += TP->getNumExpansionTemplateParameters(); - continue; - } + if (Optional<unsigned> Expansions = getExpandedPackSize(P)) { + NumRequiredArgs += *Expansions; + continue; } - break; } @@ -440,7 +426,7 @@ ClassTemplateDecl::getSpecializations() const { } llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> & -ClassTemplateDecl::getPartialSpecializations() { +ClassTemplateDecl::getPartialSpecializations() const { LoadLazySpecializations(); return getCommonPtr()->PartialSpecializations; } @@ -528,7 +514,7 @@ void ClassTemplateDecl::AddPartialSpecialization( } void ClassTemplateDecl::getPartialSpecializations( - SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) { + SmallVectorImpl<ClassTemplatePartialSpecializationDecl *> &PS) const { llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl> &PartialSpecs = getPartialSpecializations(); PS.clear(); @@ -914,10 +900,14 @@ void ClassTemplateSpecializationDecl::getNameForDiagnostic( const auto *PS = dyn_cast<ClassTemplatePartialSpecializationDecl>(this); if (const ASTTemplateArgumentListInfo *ArgsAsWritten = PS ? PS->getTemplateArgsAsWritten() : nullptr) { - printTemplateArgumentList(OS, ArgsAsWritten->arguments(), Policy); + printTemplateArgumentList( + OS, ArgsAsWritten->arguments(), Policy, + getSpecializedTemplate()->getTemplateParameters()); } else { const TemplateArgumentList &TemplateArgs = getTemplateArgs(); - printTemplateArgumentList(OS, TemplateArgs.asArray(), Policy); + printTemplateArgumentList( + OS, TemplateArgs.asArray(), Policy, + getSpecializedTemplate()->getTemplateParameters()); } } @@ -1142,7 +1132,7 @@ VarTemplateDecl::getSpecializations() const { } llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl> & -VarTemplateDecl::getPartialSpecializations() { +VarTemplateDecl::getPartialSpecializations() const { LoadLazySpecializations(); return getCommonPtr()->PartialSpecializations; } @@ -1198,7 +1188,7 @@ void VarTemplateDecl::AddPartialSpecialization( } void VarTemplateDecl::getPartialSpecializations( - SmallVectorImpl<VarTemplatePartialSpecializationDecl *> &PS) { + SmallVectorImpl<VarTemplatePartialSpecializationDecl *> &PS) const { llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl> &PartialSpecs = getPartialSpecializations(); PS.clear(); @@ -1261,10 +1251,14 @@ void VarTemplateSpecializationDecl::getNameForDiagnostic( const auto *PS = dyn_cast<VarTemplatePartialSpecializationDecl>(this); if (const ASTTemplateArgumentListInfo *ArgsAsWritten = PS ? PS->getTemplateArgsAsWritten() : nullptr) { - printTemplateArgumentList(OS, ArgsAsWritten->arguments(), Policy); + printTemplateArgumentList( + OS, ArgsAsWritten->arguments(), Policy, + getSpecializedTemplate()->getTemplateParameters()); } else { const TemplateArgumentList &TemplateArgs = getTemplateArgs(); - printTemplateArgumentList(OS, TemplateArgs.asArray(), Policy); + printTemplateArgumentList( + OS, TemplateArgs.asArray(), Policy, + getSpecializedTemplate()->getTemplateParameters()); } } @@ -1431,3 +1425,36 @@ void TypeConstraint::print(llvm::raw_ostream &OS, PrintingPolicy Policy) const { OS << ">"; } } + +TemplateParamObjectDecl *TemplateParamObjectDecl::Create(const ASTContext &C, + QualType T, + const APValue &V) { + DeclContext *DC = C.getTranslationUnitDecl(); + auto *TPOD = new (C, DC) TemplateParamObjectDecl(DC, T, V); + C.addDestruction(&TPOD->Value); + return TPOD; +} + +TemplateParamObjectDecl * +TemplateParamObjectDecl::CreateDeserialized(ASTContext &C, unsigned ID) { + auto *TPOD = new (C, ID) TemplateParamObjectDecl(nullptr, QualType(), APValue()); + C.addDestruction(&TPOD->Value); + return TPOD; +} + +void TemplateParamObjectDecl::printName(llvm::raw_ostream &OS) const { + OS << "<template param "; + printAsExpr(OS); + OS << ">"; +} + +void TemplateParamObjectDecl::printAsExpr(llvm::raw_ostream &OS) const { + const ASTContext &Ctx = getASTContext(); + getType().getUnqualifiedType().print(OS, Ctx.getPrintingPolicy()); + printAsInit(OS); +} + +void TemplateParamObjectDecl::printAsInit(llvm::raw_ostream &OS) const { + const ASTContext &Ctx = getASTContext(); + getValue().printPretty(OS, Ctx, getType()); +} |