https://github.com/Serosh-commits updated https://github.com/llvm/llvm-project/pull/180407
>From b37986bcc5f47f6115053ff82aea3ce15f6b09b3 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 builtin template ids with dependent packs (gh180307) --- clang/lib/Sema/SemaTemplate.cpp | 21 ++++++++------------- clang/test/SemaCXX/type_pack_element.cpp | 5 +++++ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 3497ff7856eed..35425fd7787b8 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -3406,7 +3406,12 @@ static QualType checkBuiltinTemplateIdType( Sema &SemaRef, ElaboratedTypeKeyword Keyword, BuiltinTemplateDecl *BTD, ArrayRef<TemplateArgument> Converted, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs) { - ASTContext &Context = SemaRef.getASTContext(); + if (llvm::any_of(Converted, [](const TemplateArgument &A) { + return A.isDependent(); + })) + return QualType(); + + ASTContext &Context = SemaRef.getASTContext(); switch (BTD->getBuiltinTemplateKind()) { case BTK__make_integer_seq: { @@ -3416,16 +3421,13 @@ static QualType checkBuiltinTemplateIdType( QualType OrigType = Converted[1].getAsType(); // C++14 [inteseq.intseq]p1: // T shall be an integer type. - if (!OrigType->isDependentType() && !OrigType->isIntegralType(Context)) { + if (!OrigType->isIntegralType(Context)) { SemaRef.Diag(TemplateArgs[1].getLocation(), diag::err_integer_sequence_integral_element_type); return QualType(); } TemplateArgument NumArgsArg = Converted[2]; - if (NumArgsArg.isDependent()) - return QualType(); - TemplateArgumentListInfo SyntheticTemplateArgs; // The type argument, wrapped in substitution sugar, gets reused as the // first template argument in the synthetic template argument list. @@ -3466,12 +3468,10 @@ static QualType checkBuiltinTemplateIdType( "__type_pack_element should be given an index and a parameter pack"); TemplateArgument IndexArg = Converted[0], Ts = Converted[1]; - if (IndexArg.isDependent() || Ts.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 Index is out of bounds, the program is ill-formed. if (Index >= Ts.pack_size()) { SemaRef.Diag(TemplateArgs[0].getLocation(), @@ -3486,8 +3486,6 @@ static QualType checkBuiltinTemplateIdType( case BTK__builtin_common_type: { assert(Converted.size() == 4); - if (llvm::any_of(Converted, [](auto &C) { return C.isDependent(); })) - return QualType(); TemplateName BaseTemplate = Converted[0].getAsTemplate(); ArrayRef<TemplateArgument> Ts = Converted[3].getPackAsArray(); @@ -3514,9 +3512,6 @@ static QualType checkBuiltinTemplateIdType( SemaRef.Diag(TemplateLoc, diag::err_hlsl_spirv_only) << BTD; } - if (llvm::any_of(Converted, [](auto &C) { return C.isDependent(); })) - return QualType(); - uint64_t Opcode = Converted[0].getAsIntegral().getZExtValue(); uint64_t Size = Converted[1].getAsIntegral().getZExtValue(); uint64_t Alignment = Converted[2].getAsIntegral().getZExtValue(); 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
