@@ -51,7 +51,7 @@ DefaultTemplateArgumentContainsUnexpandedPack(const TemplateParam &P) {
5151 P.getDefaultArgument ().getArgument ().containsUnexpandedParameterPack ();
5252}
5353
54- TemplateParameterList::TemplateParameterList (const ASTContext& C,
54+ TemplateParameterList::TemplateParameterList (const ASTContext & C,
5555 SourceLocation TemplateLoc,
5656 SourceLocation LAngleLoc,
5757 ArrayRef<NamedDecl *> Params,
@@ -244,6 +244,17 @@ bool TemplateParameterList::hasAssociatedConstraints() const {
244244 return HasRequiresClause || HasConstrainedParameters;
245245}
246246
247+ ArrayRef<TemplateArgument>
248+ TemplateParameterList::getInjectedTemplateArgs (const ASTContext &Context) {
249+ if (!InjectedArgs) {
250+ InjectedArgs = new (Context) TemplateArgument[size ()];
251+ llvm::transform (*this , InjectedArgs, [&](NamedDecl *ND) {
252+ return Context.getInjectedTemplateArg (ND);
253+ });
254+ }
255+ return {InjectedArgs, NumParams};
256+ }
257+
247258bool TemplateParameterList::shouldIncludeTypeForArgument (
248259 const PrintingPolicy &Policy, const TemplateParameterList *TPL,
249260 unsigned Idx) {
@@ -396,22 +407,6 @@ void RedeclarableTemplateDecl::addSpecializationImpl(
396407 SETraits::getDecl (Entry));
397408}
398409
399- ArrayRef<TemplateArgument> RedeclarableTemplateDecl::getInjectedTemplateArgs () {
400- TemplateParameterList *Params = getTemplateParameters ();
401- auto *CommonPtr = getCommonPtr ();
402- if (!CommonPtr->InjectedArgs ) {
403- auto &Context = getASTContext ();
404- SmallVector<TemplateArgument, 16 > TemplateArgs;
405- Context.getInjectedTemplateArgs (Params, TemplateArgs);
406- CommonPtr->InjectedArgs =
407- new (Context) TemplateArgument[TemplateArgs.size ()];
408- std::copy (TemplateArgs.begin (), TemplateArgs.end (),
409- CommonPtr->InjectedArgs );
410- }
411-
412- return llvm::ArrayRef (CommonPtr->InjectedArgs , Params->size ());
413- }
414-
415410// ===----------------------------------------------------------------------===//
416411// FunctionTemplateDecl Implementation
417412// ===----------------------------------------------------------------------===//
@@ -631,13 +626,10 @@ ClassTemplateDecl::getInjectedClassNameSpecialization() {
631626 // expansion (14.5.3) whose pattern is the name of the template parameter
632627 // pack.
633628 ASTContext &Context = getASTContext ();
634- TemplateParameterList *Params = getTemplateParameters ();
635- SmallVector<TemplateArgument, 16 > TemplateArgs;
636- Context.getInjectedTemplateArgs (Params, TemplateArgs);
637629 TemplateName Name = Context.getQualifiedTemplateName (
638630 /* NNS=*/ nullptr , /* TemplateKeyword=*/ false , TemplateName (this ));
639- CommonPtr->InjectedClassNameType =
640- Context. getTemplateSpecializationType ( Name, TemplateArgs );
631+ CommonPtr->InjectedClassNameType = Context. getTemplateSpecializationType (
632+ Name, getTemplateParameters ()-> getInjectedTemplateArgs (Context) );
641633 return CommonPtr->InjectedClassNameType ;
642634}
643635
@@ -1184,20 +1176,6 @@ SourceRange ClassTemplatePartialSpecializationDecl::getSourceRange() const {
11841176 return Range;
11851177}
11861178
1187- ArrayRef<TemplateArgument>
1188- ClassTemplatePartialSpecializationDecl::getInjectedTemplateArgs () {
1189- TemplateParameterList *Params = getTemplateParameters ();
1190- auto *First = cast<ClassTemplatePartialSpecializationDecl>(getFirstDecl ());
1191- if (!First->InjectedArgs ) {
1192- auto &Context = getASTContext ();
1193- SmallVector<TemplateArgument, 16 > TemplateArgs;
1194- Context.getInjectedTemplateArgs (Params, TemplateArgs);
1195- First->InjectedArgs = new (Context) TemplateArgument[TemplateArgs.size ()];
1196- std::copy (TemplateArgs.begin (), TemplateArgs.end (), First->InjectedArgs );
1197- }
1198- return llvm::ArrayRef (First->InjectedArgs , Params->size ());
1199- }
1200-
12011179// ===----------------------------------------------------------------------===//
12021180// FriendTemplateDecl Implementation
12031181// ===----------------------------------------------------------------------===//
@@ -1548,20 +1526,6 @@ SourceRange VarTemplatePartialSpecializationDecl::getSourceRange() const {
15481526 return Range;
15491527}
15501528
1551- ArrayRef<TemplateArgument>
1552- VarTemplatePartialSpecializationDecl::getInjectedTemplateArgs () {
1553- TemplateParameterList *Params = getTemplateParameters ();
1554- auto *First = cast<VarTemplatePartialSpecializationDecl>(getFirstDecl ());
1555- if (!First->InjectedArgs ) {
1556- auto &Context = getASTContext ();
1557- SmallVector<TemplateArgument, 16 > TemplateArgs;
1558- Context.getInjectedTemplateArgs (Params, TemplateArgs);
1559- First->InjectedArgs = new (Context) TemplateArgument[TemplateArgs.size ()];
1560- std::copy (TemplateArgs.begin (), TemplateArgs.end (), First->InjectedArgs );
1561- }
1562- return llvm::ArrayRef (First->InjectedArgs , Params->size ());
1563- }
1564-
15651529static TemplateParameterList *
15661530createMakeIntegerSeqParameterList (const ASTContext &C, DeclContext *DC) {
15671531 // typename T
0 commit comments