[clang] [clang][Sema] fix crash on __type_pack_element with dependent packs (GH180307) (PR #180407)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 9 00:37:29 PST 2026
https://github.com/Serosh-commits updated https://github.com/llvm/llvm-project/pull/180407
>From 72d925104e2893f09c5f5c149ff0a2894cfe273c Mon Sep 17 00:00:00 2001
From: Serosh-commits <janmejayapanda400 at gmail.com>
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 | 15 +++++----------
clang/test/SemaCXX/type_pack_element.cpp | 5 +++++
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index 3497ff7856eed..f61f0f9cefd9d 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -3406,6 +3406,10 @@ static QualType checkBuiltinTemplateIdType(
Sema &SemaRef, ElaboratedTypeKeyword Keyword, BuiltinTemplateDecl *BTD,
ArrayRef<TemplateArgument> Converted, SourceLocation TemplateLoc,
TemplateArgumentListInfo &TemplateArgs) {
+ if (llvm::any_of(Converted,
+ [](const TemplateArgument &A) { return A.isDependent(); }))
+ return QualType();
+
ASTContext &Context = SemaRef.getASTContext();
switch (BTD->getBuiltinTemplateKind()) {
@@ -3416,15 +3420,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
@@ -3466,8 +3468,6 @@ 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 "
@@ -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}}
More information about the cfe-commits
mailing list