@@ -744,11 +744,6 @@ class TreeTransform {
744
744
745
745
StmtResult TransformSEHHandler(Stmt *Handler);
746
746
747
- QualType TransformTemplateSpecializationType(TypeLocBuilder &TLB,
748
- TemplateSpecializationTypeLoc TL,
749
- TemplateName Template,
750
- CXXScopeSpec &SS);
751
-
752
747
QualType TransformDependentTemplateSpecializationType(
753
748
TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
754
749
QualType ObjectType, NamedDecl *UnqualLookup,
@@ -1315,9 +1310,8 @@ class TreeTransform {
1315
1310
///
1316
1311
/// By default, builds the new template name directly. Subclasses may override
1317
1312
/// 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);
1321
1315
1322
1316
/// Build a new template name given a nested name specifier and the
1323
1317
/// name that is referred to as a template.
@@ -4822,9 +4816,7 @@ TemplateName TreeTransform<Derived>::TransformTemplateName(
4822
4816
TemplateName Name, SourceLocation NameLoc, QualType ObjectType,
4823
4817
NamedDecl *FirstQualifierInScope, bool AllowInjectedClassName) {
4824
4818
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();
4828
4820
4829
4821
if (QualifierLoc) {
4830
4822
QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(
@@ -4833,20 +4825,22 @@ TemplateName TreeTransform<Derived>::TransformTemplateName(
4833
4825
return TemplateName();
4834
4826
}
4835
4827
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())
4840
4833
return TemplateName();
4834
+ assert(!UnderlyingQualifier && "unexpected qualifier");
4841
4835
4842
4836
if (!getDerived().AlwaysRebuild() &&
4843
4837
QualifierLoc.getNestedNameSpecifier() == QTN->getQualifier() &&
4844
- TransTemplate == Template )
4838
+ NewUnderlyingName == UnderlyingName )
4845
4839
return Name;
4846
4840
CXXScopeSpec SS;
4847
4841
SS.Adopt(QualifierLoc);
4848
4842
return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4849
- TransTemplate );
4843
+ NewUnderlyingName );
4850
4844
}
4851
4845
4852
4846
if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
@@ -4874,9 +4868,19 @@ TemplateName TreeTransform<Derived>::TransformTemplateName(
4874
4868
4875
4869
if (SubstTemplateTemplateParmStorage *S =
4876
4870
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
+
4877
4881
TemplateName NewName = getDerived().TransformTemplateName(
4878
- QualifierLoc , TemplateKWLoc, S->getReplacement() , NameLoc, ObjectType ,
4879
- FirstQualifierInScope, AllowInjectedClassName);
4882
+ ReplacementQualifierLoc , TemplateKWLoc, ReplacementName , NameLoc,
4883
+ ObjectType, FirstQualifierInScope, AllowInjectedClassName);
4880
4884
if (NewName.isNull())
4881
4885
return TemplateName();
4882
4886
Decl *AssociatedDecl =
@@ -4892,21 +4896,17 @@ TemplateName TreeTransform<Derived>::TransformTemplateName(
4892
4896
assert(!Name.getAsDeducedTemplateName() &&
4893
4897
"DeducedTemplateName should not escape partial ordering");
4894
4898
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)));
4906
4904
}
4907
4905
4908
4906
if (SubstTemplateTemplateParmPackStorage *SubstPack
4909
4907
= Name.getAsSubstTemplateTemplateParmPack()) {
4908
+ assert(!QualifierLoc &&
4909
+ "Unexpected qualified SubstTemplateTemplateParmPack");
4910
4910
return getDerived().RebuildTemplateName(
4911
4911
SubstPack->getArgumentPack(), SubstPack->getAssociatedDecl(),
4912
4912
SubstPack->getIndex(), SubstPack->getFinal());
@@ -17497,13 +17497,12 @@ QualType TreeTransform<Derived>::RebuildDependentBitIntType(
17497
17497
return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc);
17498
17498
}
17499
17499
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) {
17505
17504
return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
17506
- TemplateName(Template) );
17505
+ Name );
17507
17506
}
17508
17507
17509
17508
template <typename Derived>
0 commit comments