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
