diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 57fcc4b3b3682..1e126a8875331 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -7765,17 +7765,23 @@ QualType TreeTransform::TransformDependentTemplateSpecializationType( NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc()); NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc()); - typedef TemplateArgumentLocContainerIterator< - DependentTemplateSpecializationTypeLoc> ArgIterator; - if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0), - ArgIterator(TL, TL.getNumArgs()), - NewTemplateArgs)) + auto ArgsRange = llvm::make_range>({TL, 0}, {TL, TL.getNumArgs()}); + + if (getDerived().TransformTemplateArguments(ArgsRange.begin(), + ArgsRange.end(), NewTemplateArgs)) return QualType(); + bool TemplateArgumentsChanged = !llvm::equal( + ArgsRange, NewTemplateArgs.arguments(), + [](const TemplateArgumentLoc &A, const TemplateArgumentLoc &B) { + return A.getArgument().structurallyEquals(B.getArgument()); + }); const DependentTemplateStorage &DTN = T->getDependentTemplateName(); QualType Result = TL.getType(); - if (getDerived().AlwaysRebuild() || SS.getScopeRep() != DTN.getQualifier()) { + if (getDerived().AlwaysRebuild() || SS.getScopeRep() != DTN.getQualifier() || + TemplateArgumentsChanged) { TemplateName Name = getDerived().RebuildTemplateName( SS, TL.getTemplateKeywordLoc(), DTN.getName(), TL.getTemplateNameLoc(), /*ObjectType=*/QualType(), /*FirstQualifierInScope=*/nullptr, diff --git a/clang/test/SemaTemplate/dependent-names.cpp b/clang/test/SemaTemplate/dependent-names.cpp index 92620e862fe3a..538abde3eddd5 100644 --- a/clang/test/SemaTemplate/dependent-names.cpp +++ b/clang/test/SemaTemplate/dependent-names.cpp @@ -458,3 +458,12 @@ namespace PR37680 { }; int f(b ba) { return ba.add<0>(); } } + +namespace TransformDependentTemplates { + template struct Test1 { + template + using Arg = typename T::template Arg; + void f(Arg); + void f(Arg); + }; +} // namespace TransformDependentTemplates