[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 05:12:41 PST 2026
https://github.com/Serosh-commits updated https://github.com/llvm/llvm-project/pull/180407
>From a7aea8d748c27bae95787eb5f6646b74795598f0 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 | 10 ++++++-
.../builtin_templates_invalid_parameters.cpp | 27 +++++++++++++++++++
2 files changed, 36 insertions(+), 1 deletion(-)
create mode 100644 clang/test/SemaCXX/builtin_templates_invalid_parameters.cpp
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp
index 3497ff7856eed..01e0ec461fde3 100644
--- a/clang/lib/Sema/SemaTemplate.cpp
+++ b/clang/lib/Sema/SemaTemplate.cpp
@@ -3406,17 +3406,25 @@ 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(); }) ||
+ Converted.size() <
+ BTD->getTemplateParameters()->getMinRequiredArguments())
+ return QualType();
+
ASTContext &Context = SemaRef.getASTContext();
switch (BTD->getBuiltinTemplateKind()) {
case BTK__make_integer_seq: {
+ assert(Converted.size() == 3);
// Specializations of __make_integer_seq<S, T, N> are treated like
// S<T, 0, ..., N-1>.
QualType OrigType = Converted[1].getAsType();
+ assert(!OrigType->isDependentType());
// 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();
diff --git a/clang/test/SemaCXX/builtin_templates_invalid_parameters.cpp b/clang/test/SemaCXX/builtin_templates_invalid_parameters.cpp
new file mode 100644
index 0000000000000..2841f6ac14d04
--- /dev/null
+++ b/clang/test/SemaCXX/builtin_templates_invalid_parameters.cpp
@@ -0,0 +1,27 @@
+// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
+
+using SizeT = decltype(sizeof(int));
+
+// Test insufficient parameters for built-in templates.
+// These should be caught even if arguments are dependent.
+
+template <SizeT... Seq>
+void test_type_pack_element_insufficient(__type_pack_element<Seq...>) {}
+
+template <typename T>
+void test_make_integer_seq_insufficient(__make_integer_seq<T>) {}
+
+template <typename T>
+using test_common_type_insufficient = __builtin_common_type<T>;
+
+// Standard usage checks for non-dependent cases that are still broken.
+using t1 = __type_pack_element<0>; // expected-error {{a parameter pack may not be accessed at an out of bounds index}}
+using t2 = __make_integer_seq<int>; // expected-error {{too few template arguments for class template '__make_integer_seq'}}
+using t3 = __builtin_common_type<int>; // expected-error {{too few template arguments for class template '__builtin_common_type'}}
+
+// Dependent cases that previously crashed but now return QualType() gracefully.
+template <SizeT... Seq>
+using gh180307 = __type_pack_element<Seq...>;
+
+template <typename T>
+using gh180307_bis = __make_integer_seq<gh180307, T>; // expected-error {{too few template arguments for class template '__make_integer_seq'}}
More information about the cfe-commits
mailing list