https://github.com/Serosh-commits updated https://github.com/llvm/llvm-project/pull/180407
>From 2c188410aeb3498b844203a01a369fd49580f144 Mon Sep 17 00:00:00 2001 From: Serosh-commits <[email protected]> Date: Sun, 8 Feb 2026 17:40:06 +0530 Subject: [PATCH] [clang][Sema] Fix crash on __type_pack_element with dependent packs (GH180307) Ensure __type_pack_element handles cases where Converted.size() is 1, which can happen with dependent pack expansions or missing arguments. Instead of asserting, emit an out-of-bounds error for the missing pack case and return QualType() for the dependent case. --- clang/lib/Sema/SemaTemplate.cpp | 18 +++++++++++++++--- clang/test/SemaCXX/type_pack_element.cpp | 5 +++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 3497ff7856eed..c4201ac93fe6c 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -3462,16 +3462,28 @@ static QualType checkBuiltinTemplateIdType( // Specializations of // __type_pack_element<Index, T_1, ..., T_N> // are treated like T_Index. - assert(Converted.size() == 2 && + assert((Converted.size() == 1 || Converted.size() == 2) && "__type_pack_element should be given an index and a parameter pack"); - TemplateArgument IndexArg = Converted[0], Ts = Converted[1]; - if (IndexArg.isDependent() || Ts.isDependent()) + TemplateArgument IndexArg = Converted[0]; + if (IndexArg.isDependent()) return QualType(); llvm::APSInt Index = IndexArg.getAsIntegral(); assert(Index >= 0 && "the index used with __type_pack_element should be of " "type std::size_t, and hence be non-negative"); + + // If the pack is empty, we only have the index argument. + if (Converted.size() == 1) { + SemaRef.Diag(TemplateArgs[0].getLocation(), + diag::err_type_pack_element_out_of_bounds); + return QualType(); + } + + TemplateArgument Ts = Converted[1]; + if (Ts.isDependent()) + return QualType(); + // If the Index is out of bounds, the program is ill-formed. if (Index >= Ts.pack_size()) { SemaRef.Diag(TemplateArgs[0].getLocation(), diff --git a/clang/test/SemaCXX/type_pack_element.cpp b/clang/test/SemaCXX/type_pack_element.cpp index d22d5fa2ba67c..1ac5c861c18e8 100644 --- a/clang/test/SemaCXX/type_pack_element.cpp +++ b/clang/test/SemaCXX/type_pack_element.cpp @@ -43,3 +43,8 @@ static_assert(__is_same(__type_pack_element<5, X<0>, X<1>, X<2>, X<3>, X<4>, X<5 template <SizeT Index, typename ...T> using ErrorTypePackElement1 = __type_pack_element<Index, T...>; // expected-error{{may not be accessed at an out of bounds index}} using illformed1 = ErrorTypePackElement1<3, X<0>, X<1>>; // expected-note{{in instantiation}} + +template <SizeT... Seq> +void gh180307(__type_pack_element<Seq...>) {} + +using gh180307_empty = __type_pack_element<0>; // expected-error {{a parameter pack may not be accessed at an out of bounds index}} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
