Skip to content

Commit 735f5b1

Browse files
authored
[clang] fix DependentTemplateSpecializationType transform (#134748)
This changes the transform for DTST so it rebuilds the node if any of the template arguments changed. This fixes a regression reported here: #133610 (comment) which was introduced by #133610 There are no release notes since the regression was never released.
1 parent 1f35961 commit 735f5b1

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

clang/lib/Sema/TreeTransform.h

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7765,17 +7765,23 @@ QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
77657765
NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
77667766
NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
77677767

7768-
typedef TemplateArgumentLocContainerIterator<
7769-
DependentTemplateSpecializationTypeLoc> ArgIterator;
7770-
if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
7771-
ArgIterator(TL, TL.getNumArgs()),
7772-
NewTemplateArgs))
7768+
auto ArgsRange = llvm::make_range<TemplateArgumentLocContainerIterator<
7769+
DependentTemplateSpecializationTypeLoc>>({TL, 0}, {TL, TL.getNumArgs()});
7770+
7771+
if (getDerived().TransformTemplateArguments(ArgsRange.begin(),
7772+
ArgsRange.end(), NewTemplateArgs))
77737773
return QualType();
7774+
bool TemplateArgumentsChanged = !llvm::equal(
7775+
ArgsRange, NewTemplateArgs.arguments(),
7776+
[](const TemplateArgumentLoc &A, const TemplateArgumentLoc &B) {
7777+
return A.getArgument().structurallyEquals(B.getArgument());
7778+
});
77747779

77757780
const DependentTemplateStorage &DTN = T->getDependentTemplateName();
77767781

77777782
QualType Result = TL.getType();
7778-
if (getDerived().AlwaysRebuild() || SS.getScopeRep() != DTN.getQualifier()) {
7783+
if (getDerived().AlwaysRebuild() || SS.getScopeRep() != DTN.getQualifier() ||
7784+
TemplateArgumentsChanged) {
77797785
TemplateName Name = getDerived().RebuildTemplateName(
77807786
SS, TL.getTemplateKeywordLoc(), DTN.getName(), TL.getTemplateNameLoc(),
77817787
/*ObjectType=*/QualType(), /*FirstQualifierInScope=*/nullptr,

clang/test/SemaTemplate/dependent-names.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,3 +458,12 @@ namespace PR37680 {
458458
};
459459
int f(b<a> ba) { return ba.add<0>(); }
460460
}
461+
462+
namespace TransformDependentTemplates {
463+
template <class T> struct Test1 {
464+
template <class T2>
465+
using Arg = typename T::template Arg<T2>;
466+
void f(Arg<void>);
467+
void f(Arg<int>);
468+
};
469+
} // namespace TransformDependentTemplates

0 commit comments

Comments
 (0)