[clang] 73feab5 - [clang] fix getTrivialTemplateArgumentLoc template template argument (#153344)

via cfe-commits cfe-commits at lists.llvm.org
Tue Aug 12 22:09:12 PDT 2025


Author: Matheus Izvekov
Date: 2025-08-13T02:09:08-03:00
New Revision: 73feab502e5e9d6d32c1987d71e3da7f9f70a1f0

URL: https://github.com/llvm/llvm-project/commit/73feab502e5e9d6d32c1987d71e3da7f9f70a1f0
DIFF: https://github.com/llvm/llvm-project/commit/73feab502e5e9d6d32c1987d71e3da7f9f70a1f0.diff

LOG: [clang] fix getTrivialTemplateArgumentLoc template template argument (#153344)

This fixes a regression reported here
https://github.com/llvm/llvm-project/pull/147835#issuecomment-3181811371,
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.

Added: 
    

Modified: 
    clang/lib/Sema/SemaTemplateDeduction.cpp
    clang/test/SemaTemplate/ctad.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp
index 3aa808e165bb6..477f8c7541939 100644
--- a/clang/lib/Sema/SemaTemplateDeduction.cpp
+++ b/clang/lib/Sema/SemaTemplateDeduction.cpp
@@ -2911,11 +2911,7 @@ Sema::getTrivialTemplateArgumentLoc(const TemplateArgument &Arg,
     case TemplateArgument::TemplateExpansion: {
       NestedNameSpecifierLocBuilder Builder;
       TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
-      if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
-        Builder.MakeTrivial(Context, DTN->getQualifier(), Loc);
-      else if (QualifiedTemplateName *QTN =
-                   Template.getAsQualifiedTemplateName())
-        Builder.MakeTrivial(Context, QTN->getQualifier(), Loc);
+      Builder.MakeTrivial(Context, Template.getQualifier(), Loc);
       return TemplateArgumentLoc(
           Context, Arg, Loc, Builder.getWithLocInContext(Context), Loc,
           /*EllipsisLoc=*/Arg.getKind() == TemplateArgument::TemplateExpansion

diff  --git a/clang/test/SemaTemplate/ctad.cpp b/clang/test/SemaTemplate/ctad.cpp
index 49c46150d964c..1a575ea527006 100644
--- a/clang/test/SemaTemplate/ctad.cpp
+++ b/clang/test/SemaTemplate/ctad.cpp
@@ -90,3 +90,17 @@ namespace AsValueParameter {
   // cxx17-error at -1 {{value of type 'foo::A<int>' is not implicitly convertible to 'int'}}
   // cxx20-error at -2 {{non-type template parameter has non-literal type 'foo::A<int>' (aka 'AsValueParameter::foo::A<int>')}}
 } // namespace AsValueParameter
+
+namespace ConvertDeducedTemplateArgument {
+  namespace A {
+    template <class> struct B {};
+  }
+
+  template <template <class> class TT1> struct C {
+    C(TT1<int>);
+  };
+
+  template <template <class> class TT2> using D = TT2<int>;
+
+  auto x = C(D<A::B>());
+}


        


More information about the cfe-commits mailing list