https://github.com/Kristianerik updated 
https://github.com/llvm/llvm-project/pull/207478

>From 49f0c0585d7fe0f9e99fdfb63fc09911a4ae61e6 Mon Sep 17 00:00:00 2001
From: Kristianerik <[email protected]>
Date: Fri, 3 Jul 2026 20:33:39 -0700
Subject: [PATCH] [Sema] Fix crash in
 DeclareAggregateDeductionGuideFromInitList for alias templates

---
 clang/docs/ReleaseNotes.md                    |  1 +
 clang/lib/Sema/SemaTemplateDeductionGuide.cpp |  1 +
 .../ctad-alias-aggregate-crash.cpp            | 33 +++++++++++++++++++
 3 files changed, 35 insertions(+)
 create mode 100644 clang/test/SemaTemplate/ctad-alias-aggregate-crash.cpp

diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index 77b6f89e39f83..48849281b73b6 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -899,6 +899,7 @@ latest release, please see the [Clang Web 
Site](https://clang.llvm.org) or the
   immediate-escalated callable. (#GH192846)
 - Fixed a crash when passing one sized implicitly casted vector to a `abs` 
function. (#GH204777)
 - Fixed a crash when diagnosing an invalid out-of-line definition of a member 
class template. (#GH201490)
+- Fixed a crash in CTAD for type alias templates when the aggregate deduction 
guide could not be resolved. (#GH206994)
 
 ### OpenACC Specific Changes
 
diff --git a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp 
b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp
index fa740d5581e5f..ab8e6a3555d90 100644
--- a/clang/lib/Sema/SemaTemplateDeductionGuide.cpp
+++ b/clang/lib/Sema/SemaTemplateDeductionGuide.cpp
@@ -1606,6 +1606,7 @@ CXXDeductionGuideDecl 
*Sema::DeclareAggregateDeductionGuideFromInitList(
       AggregateDeductionCandidates[Hash] = GD;
       return GD;
     }
+    return nullptr;
   }
 
   if (CXXRecordDecl *DefRecord =
diff --git a/clang/test/SemaTemplate/ctad-alias-aggregate-crash.cpp 
b/clang/test/SemaTemplate/ctad-alias-aggregate-crash.cpp
new file mode 100644
index 0000000000000..b9d7d9470eb1e
--- /dev/null
+++ b/clang/test/SemaTemplate/ctad-alias-aggregate-crash.cpp
@@ -0,0 +1,33 @@
+// RUN: %clang_cc1 -std=c++23 -fsyntax-only -verify %s
+
+// Reduced from a fuzzer-generated crash report. Every line is needed
+// to trigger the specific error recovery state that causes the crash.
+
+__detail __detail:); // expected-error {{unknown type name '__detail'}} \
+                     // expected-error {{expected ';' after top level 
declarator}} \
+                     // expected-error {{expected unqualified-id}}
+template _Tptypename convertible_to_Tpcommon_reference_t_Tp_Up } // 
expected-error {{unknown type name '_Tptypename'; did you mean 'typename'?}} \
+  // expected-error {{expected a qualified name after 'typename'}} \
+  // expected-error {{variable cannot be defined in an explicit 
instantiation}} \
+  // expected-error {{expected ';' after top level declarator}} \
+  // expected-error {{extraneous closing brace}}
+requires0template // expected-error {{unknown type name 'requires0template'}}
+namespace ranges __iter_traits >; // expected-error {{expected 
unqualified-id}} \
+  // expected-error {{expected '{'}} \
+  // expected-error {{unknown type name '__iter_traits'}} \
+  // expected-error {{expected unqualified-id}}
+template  __iter_diff_tremove_cvref_t_Tp rangesiter_swap0 // expected-error 
{{unknown type name '__iter_diff_tremove_cvref_t_Tp'}} \
+  // expected-error {{expected ';' after top level declarator}}
+namespace detail { // expected-error {{variable cannot be defined in an 
explicit instantiation}}
+template < typename > struct difference_type_ // expected-error {{expected ';' 
after struct}} \
+  // expected-note {{'detail::difference_type_' declared here}}
+}
+template < typename T > using difference_type = difference_type_< T >; // 
expected-error {{no template named 'difference_type_'; did you mean 
'detail::difference_type_'?}}
+namespace detail { // expected-note {{to match this '{'}}
+template < typename T >
+struct difference_type_ :  T // expected-error {{expected '{' after base class 
list}} \
+  // expected-error {{base specifier must name a class}}
+} difference_type alloc_limit = 4 // expected-error {{expected ';' after 
struct}} \
+  // expected-error {{expected ';' after top level declarator}} \
+  // expected-note {{in instantiation of template class}}
+// expected-error {{expected '}'}}
\ No newline at end of file

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

Reply via email to