llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Matheus Izvekov (mizvekov)

<details>
<summary>Changes</summary>

Fix crash when a template template parameter specialization is used as a 
deduced type.

This is a regression since Clang 22, and this will be backported, so no release 
notes.

Fixes #<!-- -->203261

---
Full diff: https://github.com/llvm/llvm-project/pull/207263.diff


2 Files Affected:

- (modified) clang/lib/Sema/SemaDeclCXX.cpp (+4-3) 
- (modified) clang/test/SemaTemplate/ctad.cpp (+17) 


``````````diff
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index c645d96da5c00..0692ca881bf65 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -11905,9 +11905,10 @@ bool Sema::CheckDeductionGuideDeclarator(Declarator 
&D, QualType &R,
 
       const QualifiedTemplateName *Qualifiers =
           SpecifiedName.getAsQualifiedTemplateName();
-      assert(Qualifiers && "expected QualifiedTemplate");
-      bool SimplyWritten =
-          !Qualifiers->hasTemplateKeyword() && !Qualifiers->getQualifier();
+      // A Template template parameter is never wrapped in a
+      // QualifiedTemplateName, but it's always simply-written.
+      bool SimplyWritten = !Qualifiers || (!Qualifiers->hasTemplateKeyword() &&
+                                           !Qualifiers->getQualifier());
       if (SimplyWritten && TemplateMatches)
         AcceptableReturnType = true;
       else {
diff --git a/clang/test/SemaTemplate/ctad.cpp b/clang/test/SemaTemplate/ctad.cpp
index 3c622f649a2a1..7a8a72a62e992 100644
--- a/clang/test/SemaTemplate/ctad.cpp
+++ b/clang/test/SemaTemplate/ctad.cpp
@@ -140,3 +140,20 @@ namespace GH200418 {
   using T = S<A>::X<0>;
 } // namespace GH200418
 #endif
+
+namespace GH203261 {
+  template <class> struct A {}; // expected-note {{template is declared here}}
+  template <template <class> class TT> struct S {
+    A(int) -> TT<int>;
+    // expected-error@-1 {{deduction guide must be declared in the same scope 
as template 'GH203261::A'}}
+    // expected-error@-2 {{deduced type 'TT<int>' of deduction guide is not 
written as a specialization of template 'A'}}
+  };
+} // namespace GH203261
+
+namespace TemplateTemplateParm1 {
+  template <template <class> class TT> struct S {
+    template <class> struct A {};
+    A(int) -> TT<int>;
+    // expected-error@-1 {{deduced type 'TT<int>' of deduction guide is not 
written as a specialization of template 'A'}}
+  };
+} // namespace TemplateTemplateParm1

``````````

</details>


https://github.com/llvm/llvm-project/pull/207263
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to