Expand Up
@@ -65,32 +65,29 @@ TemplateParameterList *TemplateParameterList::Create(
unsigned TemplateParameterList::getMinRequiredArguments () const {
unsigned NumRequiredArgs = 0 ;
for (iterator P = const_cast <TemplateParameterList *>(this )->begin (),
PEnd = const_cast <TemplateParameterList *>(this )->end ();
P != PEnd; ++P) {
if ((*P)->isTemplateParameterPack ()) {
if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*P))
for (const NamedDecl *P : asArray ()) {
if (P->isTemplateParameterPack ()) {
if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P))
if (NTTP->isExpandedParameterPack ()) {
NumRequiredArgs += NTTP->getNumExpansionTypes ();
continue ;
}
break ;
}
if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(* P)) {
if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(P)) {
if (TTP->hasDefaultArgument ())
break ;
} else if (NonTypeTemplateParmDecl *NTTP
= dyn_cast<NonTypeTemplateParmDecl>(*P)) {
} else if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P)) {
if (NTTP->hasDefaultArgument ())
break ;
} else if (cast<TemplateTemplateParmDecl>(* P)->hasDefaultArgument ())
} else if (cast<TemplateTemplateParmDecl>(P)->hasDefaultArgument ())
break ;
++NumRequiredArgs;
}
return NumRequiredArgs;
}
Expand All
@@ -111,12 +108,10 @@ unsigned TemplateParameterList::getDepth() const {
static void AdoptTemplateParameterList (TemplateParameterList *Params,
DeclContext *Owner) {
for (TemplateParameterList::iterator P = Params->begin (),
PEnd = Params->end ();
P != PEnd; ++P) {
(*P)->setDeclContext (Owner);
if (TemplateTemplateParmDecl *TTP = dyn_cast<TemplateTemplateParmDecl>(*P))
for (NamedDecl *P : *Params) {
P->setDeclContext (Owner);
if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(P))
AdoptTemplateParameterList (TTP->getTemplateParameters (), Owner);
}
}
Expand Down
Expand Up
@@ -157,8 +152,8 @@ RedeclarableTemplateDecl::CommonBase *RedeclarableTemplateDecl::getCommonPtr() c
}
// Update any previous declarations we saw with the common pointer.
for (unsigned I = 0 , N = PrevDecls. size (); I != N; ++I )
PrevDecls[I] ->Common = Common;
for (const RedeclarableTemplateDecl *Prev : PrevDecls)
Prev ->Common = Common;
return Common;
}
Expand Down
Expand Up
@@ -205,44 +200,41 @@ void RedeclarableTemplateDecl::addSpecializationImpl(
// / \brief Generate the injected template arguments for the given template
// / parameter list, e.g., for the injected-class-name of a class template.
static void GenerateInjectedTemplateArgs (ASTContext &Context,
TemplateParameterList *Params,
TemplateParameterList *Params,
TemplateArgument *Args) {
for (TemplateParameterList::iterator Param = Params->begin (),
ParamEnd = Params->end ();
Param != ParamEnd; ++Param) {
for (NamedDecl *Param : *Params) {
TemplateArgument Arg;
if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(* Param)) {
if (auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) {
QualType ArgType = Context.getTypeDeclType (TTP);
if (TTP->isParameterPack ())
ArgType = Context.getPackExpansionType (ArgType, None);
Arg = TemplateArgument (ArgType);
} else if (NonTypeTemplateParmDecl *NTTP =
dyn_cast<NonTypeTemplateParmDecl>(*Param)) {
} else if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) {
Expr *E = new (Context) DeclRefExpr (NTTP, /* enclosing*/ false ,
NTTP->getType ().getNonLValueExprType (Context),
Expr::getValueKindForType (NTTP->getType ()),
NTTP->getLocation ());
if (NTTP->isParameterPack ())
E = new (Context) PackExpansionExpr (Context.DependentTy , E,
NTTP->getLocation (), None);
Arg = TemplateArgument (E);
} else {
TemplateTemplateParmDecl *TTP = cast<TemplateTemplateParmDecl>(* Param);
auto *TTP = cast<TemplateTemplateParmDecl>(Param);
if (TTP->isParameterPack ())
Arg = TemplateArgument (TemplateName (TTP), Optional<unsigned >());
else
Arg = TemplateArgument (TemplateName (TTP));
}
if ((* Param) ->isTemplateParameterPack ())
if (Param->isTemplateParameterPack ())
Arg = TemplateArgument::CreatePackCopy (Context, Arg);
*Args++ = Arg;
}
}
// ===----------------------------------------------------------------------===//
// FunctionTemplateDecl Implementation
// ===----------------------------------------------------------------------===//
Expand Down
Expand Up
@@ -421,23 +413,17 @@ void ClassTemplateDecl::getPartialSpecializations(
= getPartialSpecializations ();
PS.clear ();
PS.reserve (PartialSpecs.size ());
for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
P = PartialSpecs.begin (), PEnd = PartialSpecs.end ();
P != PEnd; ++P)
PS.push_back (P->getMostRecentDecl ());
for (ClassTemplatePartialSpecializationDecl &P : PartialSpecs)
PS.push_back (P.getMostRecentDecl ());
}
ClassTemplatePartialSpecializationDecl *
ClassTemplateDecl::findPartialSpecialization (QualType T) {
ASTContext &Context = getASTContext ();
using llvm::FoldingSetVector;
typedef FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
partial_spec_iterator;
for (partial_spec_iterator P = getPartialSpecializations ().begin (),
PEnd = getPartialSpecializations ().end ();
P != PEnd; ++P) {
if (Context.hasSameType (P->getInjectedSpecializationType (), T))
return P->getMostRecentDecl ();
for (ClassTemplatePartialSpecializationDecl &P :
getPartialSpecializations ()) {
if (Context.hasSameType (P.getInjectedSpecializationType (), T))
return P.getMostRecentDecl ();
}
return nullptr ;
Expand All
@@ -447,12 +433,9 @@ ClassTemplatePartialSpecializationDecl *
ClassTemplateDecl::findPartialSpecInstantiatedFromMember (
ClassTemplatePartialSpecializationDecl *D) {
Decl *DCanon = D->getCanonicalDecl ();
for (llvm::FoldingSetVector<ClassTemplatePartialSpecializationDecl>::iterator
P = getPartialSpecializations ().begin (),
PEnd = getPartialSpecializations ().end ();
P != PEnd; ++P) {
if (P->getInstantiatedFromMember ()->getCanonicalDecl () == DCanon)
return P->getMostRecentDecl ();
for (ClassTemplatePartialSpecializationDecl &P : getPartialSpecializations ()) {
if (P.getInstantiatedFromMember ()->getCanonicalDecl () == DCanon)
return P.getMostRecentDecl ();
}
return nullptr ;
Expand Down
Expand Up
@@ -535,20 +518,14 @@ bool TemplateTypeParmDecl::isParameterPack() const {
// NonTypeTemplateParmDecl Method Implementations
// ===----------------------------------------------------------------------===//
NonTypeTemplateParmDecl::NonTypeTemplateParmDecl (DeclContext *DC,
SourceLocation StartLoc,
SourceLocation IdLoc,
unsigned D, unsigned P,
IdentifierInfo *Id,
QualType T,
TypeSourceInfo *TInfo,
const QualType *ExpandedTypes,
unsigned NumExpandedTypes,
TypeSourceInfo **ExpandedTInfos)
: DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc),
TemplateParmPosition(D, P), ParameterPack(true ),
ExpandedParameterPack(true ), NumExpandedTypes(NumExpandedTypes) {
if (ExpandedTypes && ExpandedTInfos) {
NonTypeTemplateParmDecl::NonTypeTemplateParmDecl (
DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, unsigned D,
unsigned P, IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo,
ArrayRef<QualType> ExpandedTypes, ArrayRef<TypeSourceInfo *> ExpandedTInfos)
: DeclaratorDecl(NonTypeTemplateParm, DC, IdLoc, Id, T, TInfo, StartLoc),
TemplateParmPosition(D, P), ParameterPack(true ),
ExpandedParameterPack(true ), NumExpandedTypes(ExpandedTypes.size()) {
if (!ExpandedTypes.empty () && !ExpandedTInfos.empty ()) {
auto TypesAndInfos =
getTrailingObjects<std::pair<QualType, TypeSourceInfo *>>();
for (unsigned I = 0 ; I != NumExpandedTypes; ++I) {
Expand All
@@ -568,20 +545,16 @@ NonTypeTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
T, ParameterPack, TInfo);
}
NonTypeTemplateParmDecl *
NonTypeTemplateParmDecl::Create (const ASTContext &C, DeclContext *DC,
SourceLocation StartLoc, SourceLocation IdLoc,
unsigned D, unsigned P,
IdentifierInfo *Id, QualType T,
TypeSourceInfo *TInfo,
const QualType *ExpandedTypes,
unsigned NumExpandedTypes,
TypeSourceInfo **ExpandedTInfos) {
NonTypeTemplateParmDecl *NonTypeTemplateParmDecl::Create (
const ASTContext &C, DeclContext *DC, SourceLocation StartLoc,
SourceLocation IdLoc, unsigned D, unsigned P, IdentifierInfo *Id,
QualType T, TypeSourceInfo *TInfo, ArrayRef<QualType> ExpandedTypes,
ArrayRef<TypeSourceInfo *> ExpandedTInfos) {
return new (C, DC,
additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>>(
NumExpandedTypes ))
ExpandedTypes. size () ))
NonTypeTemplateParmDecl (DC, StartLoc, IdLoc, D, P, Id, T, TInfo,
ExpandedTypes, NumExpandedTypes, ExpandedTInfos);
ExpandedTypes, ExpandedTInfos);
}
NonTypeTemplateParmDecl *
Expand All
@@ -594,12 +567,14 @@ NonTypeTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
NonTypeTemplateParmDecl *
NonTypeTemplateParmDecl::CreateDeserialized (ASTContext &C, unsigned ID,
unsigned NumExpandedTypes) {
return new (C, ID,
additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>>(
NumExpandedTypes))
NonTypeTemplateParmDecl (nullptr , SourceLocation (), SourceLocation (), 0 , 0 ,
nullptr , QualType (), nullptr , nullptr ,
NumExpandedTypes, nullptr );
auto *NTTP =
new (C, ID, additionalSizeToAlloc<std::pair<QualType, TypeSourceInfo *>>(
NumExpandedTypes))
NonTypeTemplateParmDecl (nullptr , SourceLocation (), SourceLocation (),
0 , 0 , nullptr , QualType (), nullptr , None,
None);
NTTP->NumExpandedTypes = NumExpandedTypes;
return NTTP;
}
SourceRange NonTypeTemplateParmDecl::getSourceRange () const {
Expand All
@@ -624,12 +599,12 @@ void TemplateTemplateParmDecl::anchor() { }
TemplateTemplateParmDecl::TemplateTemplateParmDecl (
DeclContext *DC, SourceLocation L, unsigned D, unsigned P,
IdentifierInfo *Id, TemplateParameterList *Params,
unsigned NumExpansions, TemplateParameterList * const * Expansions)
: TemplateDecl(TemplateTemplateParm, DC, L, Id, Params),
TemplateParmPosition(D, P), ParameterPack(true ),
ExpandedParameterPack(true ), NumExpandedParams(NumExpansions ) {
if (Expansions)
std::uninitialized_copy (Expansions, Expansions + NumExpandedParams ,
ArrayRef< TemplateParameterList *> Expansions)
: TemplateDecl(TemplateTemplateParm, DC, L, Id, Params),
TemplateParmPosition(D, P), ParameterPack(true ),
ExpandedParameterPack(true ), NumExpandedParams(Expansions.size() ) {
if (! Expansions. empty () )
std::uninitialized_copy (Expansions. begin () , Expansions. end () ,
getTrailingObjects<TemplateParameterList *>());
}
Expand All
@@ -650,8 +625,7 @@ TemplateTemplateParmDecl::Create(const ASTContext &C, DeclContext *DC,
ArrayRef<TemplateParameterList *> Expansions) {
return new (C, DC,
additionalSizeToAlloc<TemplateParameterList *>(Expansions.size ()))
TemplateTemplateParmDecl (DC, L, D, P, Id, Params, Expansions.size (),
Expansions.data ());
TemplateTemplateParmDecl (DC, L, D, P, Id, Params, Expansions);
}
TemplateTemplateParmDecl *
Expand All
@@ -663,10 +637,12 @@ TemplateTemplateParmDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
TemplateTemplateParmDecl *
TemplateTemplateParmDecl::CreateDeserialized (ASTContext &C, unsigned ID,
unsigned NumExpansions) {
return new (C, ID,
additionalSizeToAlloc<TemplateParameterList *>(NumExpansions))
TemplateTemplateParmDecl (nullptr , SourceLocation (), 0 , 0 , nullptr ,
nullptr , NumExpansions, nullptr );
auto *TTP =
new (C, ID, additionalSizeToAlloc<TemplateParameterList *>(NumExpansions))
TemplateTemplateParmDecl (nullptr , SourceLocation (), 0 , 0 , nullptr ,
nullptr , None);
TTP->NumExpandedParams = NumExpansions;
return TTP;
}
SourceLocation TemplateTemplateParmDecl::getDefaultArgumentLoc () const {
Expand Down
Expand Up
@@ -896,15 +872,12 @@ ClassTemplatePartialSpecializationDecl::CreateDeserialized(ASTContext &C,
void FriendTemplateDecl::anchor () { }
FriendTemplateDecl *FriendTemplateDecl::Create (ASTContext &Context,
DeclContext *DC,
SourceLocation L,
unsigned NParams,
TemplateParameterList **Params,
FriendUnion Friend,
SourceLocation FLoc) {
return new (Context, DC) FriendTemplateDecl (DC, L, NParams, Params,
Friend, FLoc);
FriendTemplateDecl *
FriendTemplateDecl::Create (ASTContext &Context, DeclContext *DC,
SourceLocation L,
MutableArrayRef<TemplateParameterList *> Params,
FriendUnion Friend, SourceLocation FLoc) {
return new (Context, DC) FriendTemplateDecl (DC, L, Params, Friend, FLoc);
}
FriendTemplateDecl *FriendTemplateDecl::CreateDeserialized (ASTContext &C,
Expand Down
Expand Up
@@ -1060,23 +1033,17 @@ void VarTemplateDecl::getPartialSpecializations(
getPartialSpecializations ();
PS.clear ();
PS.reserve (PartialSpecs.size ());
for (llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl>::iterator
P = PartialSpecs.begin (),
PEnd = PartialSpecs.end ();
P != PEnd; ++P)
PS.push_back (P->getMostRecentDecl ());
for (VarTemplatePartialSpecializationDecl &P : PartialSpecs)
PS.push_back (P.getMostRecentDecl ());
}
VarTemplatePartialSpecializationDecl *
VarTemplateDecl::findPartialSpecInstantiatedFromMember (
VarTemplatePartialSpecializationDecl *D) {
Decl *DCanon = D->getCanonicalDecl ();
for (llvm::FoldingSetVector<VarTemplatePartialSpecializationDecl>::iterator
P = getPartialSpecializations ().begin (),
PEnd = getPartialSpecializations ().end ();
P != PEnd; ++P) {
if (P->getInstantiatedFromMember ()->getCanonicalDecl () == DCanon)
return P->getMostRecentDecl ();
for (VarTemplatePartialSpecializationDecl &P : getPartialSpecializations ()) {
if (P.getInstantiatedFromMember ()->getCanonicalDecl () == DCanon)
return P.getMostRecentDecl ();
}
return nullptr ;
Expand Down
Expand Up
@@ -1134,11 +1101,10 @@ VarTemplateDecl *VarTemplateSpecializationDecl::getSpecializedTemplate() const {
void VarTemplateSpecializationDecl::setTemplateArgsInfo (
const TemplateArgumentListInfo &ArgsInfo) {
unsigned N = ArgsInfo.size ();
TemplateArgsInfo.setLAngleLoc (ArgsInfo.getLAngleLoc ());
TemplateArgsInfo.setRAngleLoc (ArgsInfo.getRAngleLoc ());
for (unsigned I = 0 ; I != N; ++I )
TemplateArgsInfo.addArgument (ArgsInfo[I] );
for (const TemplateArgumentLoc &Loc : ArgsInfo. arguments () )
TemplateArgsInfo.addArgument (Loc );
}
// ===----------------------------------------------------------------------===//
Expand Down