@@ -744,11 +744,6 @@ class TreeTransform {
744744
745745 StmtResult TransformSEHHandler(Stmt *Handler);
746746
747- QualType TransformTemplateSpecializationType(TypeLocBuilder &TLB,
748- TemplateSpecializationTypeLoc TL,
749- TemplateName Template,
750- CXXScopeSpec &SS);
751-
752747 QualType TransformDependentTemplateSpecializationType(
753748 TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
754749 QualType ObjectType, NamedDecl *UnqualLookup,
@@ -1315,9 +1310,8 @@ class TreeTransform {
13151310 ///
13161311 /// By default, builds the new template name directly. Subclasses may override
13171312 /// this routine to provide different behavior.
1318- TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1319- bool TemplateKW,
1320- TemplateDecl *Template);
1313+ TemplateName RebuildTemplateName(CXXScopeSpec &SS, bool TemplateKW,
1314+ TemplateName Name);
13211315
13221316 /// Build a new template name given a nested name specifier and the
13231317 /// name that is referred to as a template.
@@ -4822,9 +4816,7 @@ TemplateName TreeTransform<Derived>::TransformTemplateName(
48224816 TemplateName Name, SourceLocation NameLoc, QualType ObjectType,
48234817 NamedDecl *FirstQualifierInScope, bool AllowInjectedClassName) {
48244818 if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4825- // FIXME: Preserve UsingTemplateName.
4826- TemplateDecl *Template = QTN->getUnderlyingTemplate().getAsTemplateDecl();
4827- assert(Template && "qualified template name must refer to a template");
4819+ TemplateName UnderlyingName = QTN->getUnderlyingTemplate();
48284820
48294821 if (QualifierLoc) {
48304822 QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(
@@ -4833,20 +4825,22 @@ TemplateName TreeTransform<Derived>::TransformTemplateName(
48334825 return TemplateName();
48344826 }
48354827
4836- TemplateDecl *TransTemplate
4837- = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4838- Template));
4839- if (!TransTemplate)
4828+ NestedNameSpecifierLoc UnderlyingQualifier;
4829+ TemplateName NewUnderlyingName = getDerived().TransformTemplateName(
4830+ UnderlyingQualifier, TemplateKWLoc, UnderlyingName, NameLoc, ObjectType,
4831+ FirstQualifierInScope, AllowInjectedClassName);
4832+ if (NewUnderlyingName.isNull())
48404833 return TemplateName();
4834+ assert(!UnderlyingQualifier && "unexpected qualifier");
48414835
48424836 if (!getDerived().AlwaysRebuild() &&
48434837 QualifierLoc.getNestedNameSpecifier() == QTN->getQualifier() &&
4844- TransTemplate == Template )
4838+ NewUnderlyingName == UnderlyingName )
48454839 return Name;
48464840 CXXScopeSpec SS;
48474841 SS.Adopt(QualifierLoc);
48484842 return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4849- TransTemplate );
4843+ NewUnderlyingName );
48504844 }
48514845
48524846 if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
@@ -4874,9 +4868,19 @@ TemplateName TreeTransform<Derived>::TransformTemplateName(
48744868
48754869 if (SubstTemplateTemplateParmStorage *S =
48764870 Name.getAsSubstTemplateTemplateParm()) {
4871+ assert(!QualifierLoc && "Unexpected qualified SubstTemplateTemplateParm");
4872+
4873+ NestedNameSpecifierLoc ReplacementQualifierLoc;
4874+ TemplateName ReplacementName = S->getReplacement();
4875+ if (NestedNameSpecifier Qualifier = ReplacementName.getQualifier()) {
4876+ NestedNameSpecifierLocBuilder Builder;
4877+ Builder.MakeTrivial(SemaRef.Context, Qualifier, NameLoc);
4878+ ReplacementQualifierLoc = Builder.getWithLocInContext(SemaRef.Context);
4879+ }
4880+
48774881 TemplateName NewName = getDerived().TransformTemplateName(
4878- QualifierLoc , TemplateKWLoc, S->getReplacement() , NameLoc, ObjectType ,
4879- FirstQualifierInScope, AllowInjectedClassName);
4882+ ReplacementQualifierLoc , TemplateKWLoc, ReplacementName , NameLoc,
4883+ ObjectType, FirstQualifierInScope, AllowInjectedClassName);
48804884 if (NewName.isNull())
48814885 return TemplateName();
48824886 Decl *AssociatedDecl =
@@ -4892,21 +4896,17 @@ TemplateName TreeTransform<Derived>::TransformTemplateName(
48924896 assert(!Name.getAsDeducedTemplateName() &&
48934897 "DeducedTemplateName should not escape partial ordering");
48944898
4895- if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4896- assert(!QualifierLoc && "missed a Qualified Template");
4897- TemplateDecl *TransTemplate
4898- = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4899- Template));
4900- if (!TransTemplate)
4901- return TemplateName();
4902-
4903- CXXScopeSpec SS;
4904- return getDerived().RebuildTemplateName(SS, /*TemplateKeyword=*/false,
4905- TransTemplate);
4899+ // FIXME: Preserve UsingTemplateName.
4900+ if (auto *Template = Name.getAsTemplateDecl()) {
4901+ assert(!QualifierLoc && "Unexpected qualifier");
4902+ return TemplateName(cast_or_null<TemplateDecl>(
4903+ getDerived().TransformDecl(NameLoc, Template)));
49064904 }
49074905
49084906 if (SubstTemplateTemplateParmPackStorage *SubstPack
49094907 = Name.getAsSubstTemplateTemplateParmPack()) {
4908+ assert(!QualifierLoc &&
4909+ "Unexpected qualified SubstTemplateTemplateParmPack");
49104910 return getDerived().RebuildTemplateName(
49114911 SubstPack->getArgumentPack(), SubstPack->getAssociatedDecl(),
49124912 SubstPack->getIndex(), SubstPack->getFinal());
@@ -17497,13 +17497,12 @@ QualType TreeTransform<Derived>::RebuildDependentBitIntType(
1749717497 return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc);
1749817498}
1749917499
17500- template<typename Derived>
17501- TemplateName
17502- TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
17503- bool TemplateKW,
17504- TemplateDecl *Template) {
17500+ template <typename Derived>
17501+ TemplateName TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
17502+ bool TemplateKW,
17503+ TemplateName Name) {
1750517504 return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
17506- TemplateName(Template) );
17505+ Name );
1750717506}
1750817507
1750917508template <typename Derived>
0 commit comments