Skip to content

Commit 73feab5

Browse files
authored
[clang] fix getTrivialTemplateArgumentLoc template template argument (#153344)
This fixes a regression reported here llvm/llvm-project#147835 (comment), where getTrivialTemplateArgumentLoc can't see through template name sugar when producing a trivial TemplateArgumentLoc for template template arguments. Since this regression was never released, there are no release notes.
1 parent 587b6ce commit 73feab5

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

clang/lib/Sema/SemaTemplateDeduction.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2911,11 +2911,7 @@ Sema::getTrivialTemplateArgumentLoc(const TemplateArgument &Arg,
29112911
case TemplateArgument::TemplateExpansion: {
29122912
NestedNameSpecifierLocBuilder Builder;
29132913
TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
2914-
if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
2915-
Builder.MakeTrivial(Context, DTN->getQualifier(), Loc);
2916-
else if (QualifiedTemplateName *QTN =
2917-
Template.getAsQualifiedTemplateName())
2918-
Builder.MakeTrivial(Context, QTN->getQualifier(), Loc);
2914+
Builder.MakeTrivial(Context, Template.getQualifier(), Loc);
29192915
return TemplateArgumentLoc(
29202916
Context, Arg, Loc, Builder.getWithLocInContext(Context), Loc,
29212917
/*EllipsisLoc=*/Arg.getKind() == TemplateArgument::TemplateExpansion

clang/test/SemaTemplate/ctad.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,17 @@ namespace AsValueParameter {
9090
// cxx17-error@-1 {{value of type 'foo::A<int>' is not implicitly convertible to 'int'}}
9191
// cxx20-error@-2 {{non-type template parameter has non-literal type 'foo::A<int>' (aka 'AsValueParameter::foo::A<int>')}}
9292
} // namespace AsValueParameter
93+
94+
namespace ConvertDeducedTemplateArgument {
95+
namespace A {
96+
template <class> struct B {};
97+
}
98+
99+
template <template <class> class TT1> struct C {
100+
C(TT1<int>);
101+
};
102+
103+
template <template <class> class TT2> using D = TT2<int>;
104+
105+
auto x = C(D<A::B>());
106+
}

0 commit comments

Comments
 (0)