/// Returns the number of explicit template arguments that were given.
unsigned getNumTemplateArgs() const { return NumArgs; }
+ llvm::ArrayRef<TemplateArgumentLoc> arguments() const {
+ return llvm::makeArrayRef(getTemplateArgs(), getNumTemplateArgs());
+ }
+
/// Returns the nth template argument.
const TemplateArgumentLoc &getTemplateArg(unsigned I) const {
assert(I < getNumTemplateArgs() && "template arg index out of range");
SubstTemplateName(NestedNameSpecifierLoc QualifierLoc, TemplateName Name,
SourceLocation Loc,
const MultiLevelTemplateArgumentList &TemplateArgs);
- bool Subst(const TemplateArgumentLoc *Args, unsigned NumArgs,
- TemplateArgumentListInfo &Result,
- const MultiLevelTemplateArgumentList &TemplateArgs);
+
+ bool SubstTypeConstraint(TemplateTypeParmDecl *Inst, const TypeConstraint *TC,
+ const MultiLevelTemplateArgumentList &TemplateArgs);
bool InstantiateDefaultArgument(SourceLocation CallLoc, FunctionDecl *FD,
ParmVarDecl *Param);
TTP->isParameterPack(), TTP->hasTypeConstraint(),
TTP->isExpandedParameterPack() ?
llvm::Optional<unsigned>(TTP->getNumExpansionParameters()) : None);
- if (const auto *TC = TTP->getTypeConstraint()) {
- TemplateArgumentListInfo TransformedArgs;
- const auto *ArgsAsWritten = TC->getTemplateArgsAsWritten();
- if (!ArgsAsWritten ||
- SemaRef.Subst(ArgsAsWritten->getTemplateArgs(),
- ArgsAsWritten->NumTemplateArgs, TransformedArgs,
- Args))
- SemaRef.AttachTypeConstraint(
- TC->getNestedNameSpecifierLoc(), TC->getConceptNameInfo(),
- TC->getNamedConcept(), ArgsAsWritten ? &TransformedArgs : nullptr,
- NewTTP,
- NewTTP->isParameterPack()
- ? cast<CXXFoldExpr>(TC->getImmediatelyDeclaredConstraint())
- ->getEllipsisLoc()
- : SourceLocation());
- }
+ if (const auto *TC = TTP->getTypeConstraint())
+ SemaRef.SubstTypeConstraint(NewTTP, TC, Args);
if (TTP->hasDefaultArgument()) {
TypeSourceInfo *InstantiatedDefaultArg =
SemaRef.SubstType(TTP->getDefaultArgumentInfo(), Args,
auto *Template = Partial->getSpecializedTemplate();
const ASTTemplateArgumentListInfo *PartialTemplArgInfo =
Partial->getTemplateArgsAsWritten();
- const TemplateArgumentLoc *PartialTemplateArgs =
- PartialTemplArgInfo->getTemplateArgs();
TemplateArgumentListInfo InstArgs(PartialTemplArgInfo->LAngleLoc,
PartialTemplArgInfo->RAngleLoc);
- if (S.Subst(PartialTemplateArgs, PartialTemplArgInfo->NumTemplateArgs,
- InstArgs, MultiLevelTemplateArgumentList(*DeducedArgumentList))) {
+ if (S.SubstTemplateArguments(
+ PartialTemplArgInfo->arguments(),
+ MultiLevelTemplateArgumentList(*DeducedArgumentList), InstArgs)) {
unsigned ArgIdx = InstArgs.size(), ParamIdx = ArgIdx;
if (ParamIdx >= Partial->getTemplateParameters()->size())
ParamIdx = Partial->getTemplateParameters()->size() - 1;
Decl *Param = const_cast<NamedDecl *>(
Partial->getTemplateParameters()->getParam(ParamIdx));
Info.Param = makeTemplateParameter(Param);
- Info.FirstArg = PartialTemplateArgs[ArgIdx].getArgument();
+ Info.FirstArg = (*PartialTemplArgInfo)[ArgIdx].getArgument();
return Sema::TDK_SubstitutionFailure;
}
} // namespace
+bool Sema::SubstTypeConstraint(
+ TemplateTypeParmDecl *Inst, const TypeConstraint *TC,
+ const MultiLevelTemplateArgumentList &TemplateArgs) {
+ const ASTTemplateArgumentListInfo *TemplArgInfo =
+ TC->getTemplateArgsAsWritten();
+ TemplateArgumentListInfo InstArgs;
+
+ if (TemplArgInfo) {
+ InstArgs.setLAngleLoc(TemplArgInfo->LAngleLoc);
+ InstArgs.setRAngleLoc(TemplArgInfo->RAngleLoc);
+ if (SubstTemplateArguments(TemplArgInfo->arguments(), TemplateArgs,
+ InstArgs))
+ return true;
+ }
+ return AttachTypeConstraint(
+ TC->getNestedNameSpecifierLoc(), TC->getConceptNameInfo(),
+ TC->getNamedConcept(), &InstArgs, Inst,
+ Inst->isParameterPack()
+ ? cast<CXXFoldExpr>(TC->getImmediatelyDeclaredConstraint())
+ ->getEllipsisLoc()
+ : SourceLocation());
+}
+
ParmVarDecl *Sema::SubstParmVarDecl(ParmVarDecl *OldParm,
const MultiLevelTemplateArgumentList &TemplateArgs,
int indexAdjustment,
if (Inst && !Inst->getTypeConstraint()) {
// TODO: Concepts: do not instantiate the constraint (delayed constraint
// substitution)
- const ASTTemplateArgumentListInfo *TemplArgInfo
- = TC->getTemplateArgsAsWritten();
- TemplateArgumentListInfo InstArgs;
-
- if (TemplArgInfo) {
- InstArgs.setLAngleLoc(TemplArgInfo->LAngleLoc);
- InstArgs.setRAngleLoc(TemplArgInfo->RAngleLoc);
- if (Subst(TemplArgInfo->getTemplateArgs(),
- TemplArgInfo->NumTemplateArgs, InstArgs, TemplateArgs))
- return nullptr;
- }
- if (AttachTypeConstraint(
- TC->getNestedNameSpecifierLoc(), TC->getConceptNameInfo(),
- TC->getNamedConcept(), TemplArgInfo ? &InstArgs : nullptr, Inst,
- TTP->isParameterPack()
- ? cast<CXXFoldExpr>(TC->getImmediatelyDeclaredConstraint())
- ->getEllipsisLoc()
- : SourceLocation()))
+ if (SubstTypeConstraint(Inst, TC, TemplateArgs))
return nullptr;
}
}
return Instantiator.TransformTemplateName(SS, Name, Loc);
}
-bool Sema::Subst(const TemplateArgumentLoc *Args, unsigned NumArgs,
- TemplateArgumentListInfo &Result,
- const MultiLevelTemplateArgumentList &TemplateArgs) {
- TemplateInstantiator Instantiator(*this, TemplateArgs, SourceLocation(),
- DeclarationName());
-
- return Instantiator.TransformTemplateArguments(Args, NumArgs, Result);
-}
-
static const Decl *getCanonicalParmVarDecl(const Decl *D) {
// When storing ParmVarDecls in the local instantiation scope, we always
// want to use the ParmVarDecl from the canonical function declaration,
// Instantiate the explicit template arguments.
TemplateArgumentListInfo ExplicitArgs(Info->getLAngleLoc(),
Info->getRAngleLoc());
- if (SemaRef.Subst(Info->getTemplateArgs(), Info->getNumTemplateArgs(),
- ExplicitArgs, TemplateArgs))
+ if (SemaRef.SubstTemplateArguments(Info->arguments(), TemplateArgs,
+ ExplicitArgs))
return nullptr;
// Map the candidate templates to their instantiations.
// Instantiate the explicit template arguments.
TemplateArgumentListInfo ExplicitArgs(Info->getLAngleLoc(),
Info->getRAngleLoc());
- if (SemaRef.Subst(Info->getTemplateArgs(), Info->getNumTemplateArgs(),
- ExplicitArgs, TemplateArgs))
+ if (SemaRef.SubstTemplateArguments(Info->arguments(), TemplateArgs,
+ ExplicitArgs))
return nullptr;
if (SemaRef.CheckFunctionTemplateSpecialization(Function,
// Instantiate the explicit template arguments.
TemplateArgumentListInfo ExplicitArgs(Info->getLAngleLoc(),
Info->getRAngleLoc());
- if (SemaRef.Subst(Info->getTemplateArgs(), Info->getNumTemplateArgs(),
- ExplicitArgs, TemplateArgs))
+ if (SemaRef.SubstTemplateArguments(Info->arguments(), TemplateArgs,
+ ExplicitArgs))
return nullptr;
// Map the candidate templates to their instantiations.
TemplateArgumentListInfo ExplicitArgs(Info->getLAngleLoc(),
Info->getRAngleLoc());
- if (SemaRef.Subst(Info->getTemplateArgs(), Info->getNumTemplateArgs(),
- ExplicitArgs, TemplateArgs))
+ if (SemaRef.SubstTemplateArguments(Info->arguments(), TemplateArgs,
+ ExplicitArgs))
return nullptr;
if (SemaRef.CheckFunctionTemplateSpecialization(Method,
// TODO: Concepts: do not instantiate the constraint (delayed constraint
// substitution)
- const ASTTemplateArgumentListInfo *TemplArgInfo
- = TC->getTemplateArgsAsWritten();
- TemplateArgumentListInfo InstArgs;
-
- if (TemplArgInfo) {
- InstArgs.setLAngleLoc(TemplArgInfo->LAngleLoc);
- InstArgs.setRAngleLoc(TemplArgInfo->RAngleLoc);
- if (SemaRef.Subst(TemplArgInfo->getTemplateArgs(),
- TemplArgInfo->NumTemplateArgs,
- InstArgs, TemplateArgs))
- return nullptr;
- }
- if (SemaRef.AttachTypeConstraint(
- TC->getNestedNameSpecifierLoc(), TC->getConceptNameInfo(),
- TC->getNamedConcept(), &InstArgs, Inst,
- D->isParameterPack()
- ? cast<CXXFoldExpr>(TC->getImmediatelyDeclaredConstraint())
- ->getEllipsisLoc()
- : SourceLocation()))
+ if (SemaRef.SubstTypeConstraint(Inst, TC, TemplateArgs))
return nullptr;
}
}
SmallVector<TemplateArgumentLoc, 4> ArgLocs;
for (unsigned I = 0; I != Loc.getNumArgs(); ++I)
ArgLocs.push_back(Loc.getArgLoc(I));
- if (SemaRef.Subst(ArgLocs.data(), ArgLocs.size(),
- InstTemplateArgs, TemplateArgs))
+ if (SemaRef.SubstTemplateArguments(ArgLocs, TemplateArgs, InstTemplateArgs))
return nullptr;
// Check that the template argument list is well-formed for this
VarTemplateArgsInfo.setLAngleLoc(TemplateArgsInfo.getLAngleLoc());
VarTemplateArgsInfo.setRAngleLoc(TemplateArgsInfo.getRAngleLoc());
- if (SemaRef.Subst(TemplateArgsInfo.getArgumentArray(),
- TemplateArgsInfo.size(), VarTemplateArgsInfo, TemplateArgs))
+ if (SemaRef.SubstTemplateArguments(TemplateArgsInfo.arguments(), TemplateArgs,
+ VarTemplateArgsInfo))
return nullptr;
// Check that the template argument list is well-formed for this template.
= PartialSpec->getTemplateArgsAsWritten();
TemplateArgumentListInfo InstTemplateArgs(TemplArgInfo->LAngleLoc,
TemplArgInfo->RAngleLoc);
- if (SemaRef.Subst(TemplArgInfo->getTemplateArgs(),
- TemplArgInfo->NumTemplateArgs,
- InstTemplateArgs, TemplateArgs))
+ if (SemaRef.SubstTemplateArguments(TemplArgInfo->arguments(), TemplateArgs,
+ InstTemplateArgs))
return nullptr;
// Check that the template argument list is well-formed for this
= PartialSpec->getTemplateArgsAsWritten();
TemplateArgumentListInfo InstTemplateArgs(TemplArgInfo->LAngleLoc,
TemplArgInfo->RAngleLoc);
- if (SemaRef.Subst(TemplArgInfo->getTemplateArgs(),
- TemplArgInfo->NumTemplateArgs,
- InstTemplateArgs, TemplateArgs))
+ if (SemaRef.SubstTemplateArguments(TemplArgInfo->arguments(), TemplateArgs,
+ InstTemplateArgs))
return nullptr;
// Check that the template argument list is well-formed for this