aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/clang/lib/AST/DeclTemplate.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/clang/lib/AST/DeclTemplate.cpp')
-rwxr-xr-xcontrib/llvm-project/clang/lib/AST/DeclTemplate.cpp77
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());
+}