[clang] [Clang][Sema] Fix crash in containsUnexpandedParameterPacks (PR #182484)
Ayush Kumar Gaur via cfe-commits
cfe-commits at lists.llvm.org
Sat Feb 21 20:28:12 PST 2026
https://github.com/Ayush3941 updated https://github.com/llvm/llvm-project/pull/182484
>From 19ae71d232619fb48f5357d417dd77256a9d9b3b Mon Sep 17 00:00:00 2001
From: Ayush3941 <ayushkgaur1 at gmail.com>
Date: Fri, 20 Feb 2026 07:22:12 -0500
Subject: [PATCH 1/3] [Clang][Sema] Fix crash in
containsUnexpandedParameterPacks on invalid C input
---
clang/lib/Sema/SemaTemplateVariadic.cpp | 9 +++++----
clang/test/Sema/function.c | 8 ++++++++
2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/clang/lib/Sema/SemaTemplateVariadic.cpp b/clang/lib/Sema/SemaTemplateVariadic.cpp
index 5b1aad3fa8470..c959e0834b9f1 100644
--- a/clang/lib/Sema/SemaTemplateVariadic.cpp
+++ b/clang/lib/Sema/SemaTemplateVariadic.cpp
@@ -1215,12 +1215,13 @@ bool Sema::containsUnexpandedParameterPacks(Declarator &D) {
break;
case DeclaratorChunk::Function:
for (unsigned i = 0, e = Chunk.Fun.NumParams; i != e; ++i) {
- ParmVarDecl *Param = cast<ParmVarDecl>(Chunk.Fun.Params[i].Param);
+ auto *Param = dyn_cast_or_null<ParmVarDecl>(Chunk.Fun.Params[i].Param);
+ if (!Param)
+ continue;
QualType ParamTy = Param->getType();
- assert(!ParamTy.isNull() && "Couldn't parse type?");
- if (ParamTy->containsUnexpandedParameterPack()) return true;
+ if (!ParamTy.isNull() && ParamTy->containsUnexpandedParameterPack())
+ return true;
}
-
if (Chunk.Fun.getExceptionSpecType() == EST_Dynamic) {
for (unsigned i = 0; i != Chunk.Fun.getNumExceptions(); ++i) {
if (Chunk.Fun.Exceptions[i]
diff --git a/clang/test/Sema/function.c b/clang/test/Sema/function.c
index 990631ee69cd5..eae38cd691d73 100644
--- a/clang/test/Sema/function.c
+++ b/clang/test/Sema/function.c
@@ -118,3 +118,11 @@ void const Bar (void); // ok on decl
void const Bar (void) // expected-warning {{function cannot return qualified void type 'const void'}}
{
}
+
+// issue 182154
+int gh182154_g(int);
+int gh182154_h(int);
+int gh182154_x = 0;
+gh182154_g(gh182154_h(gh182154_x)...); // expected-error 2{{type specifier missing, defaults to 'int'}} \
+ // expected-error {{a parameter list without types is only allowed in a function definition}} \
+ // expected-error {{requires a comma prior to the ellipsis}}
>From 2db060f7dab583068210fa68bd810ba6a373203d Mon Sep 17 00:00:00 2001
From: Ayush Kumar Gaur <132849148+Ayush3941 at users.noreply.github.com>
Date: Fri, 20 Feb 2026 07:27:37 -0500
Subject: [PATCH 2/3] Fix issue reference in function.c
Updated issue reference from 182154 to 182484.
---
clang/test/Sema/function.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/test/Sema/function.c b/clang/test/Sema/function.c
index eae38cd691d73..211b9b2c74c9a 100644
--- a/clang/test/Sema/function.c
+++ b/clang/test/Sema/function.c
@@ -119,7 +119,7 @@ void const Bar (void) // expected-warning {{function cannot return qualified voi
{
}
-// issue 182154
+// PR #182484
int gh182154_g(int);
int gh182154_h(int);
int gh182154_x = 0;
>From f9384dc5e9498a9b07d08513ea59c01f752a40f1 Mon Sep 17 00:00:00 2001
From: Ayush Kumar Gaur <132849148+Ayush3941 at users.noreply.github.com>
Date: Sat, 21 Feb 2026 23:28:03 -0500
Subject: [PATCH 3/3] Change dyn_cast_or_null to cast_or_null for Param
---
clang/lib/Sema/SemaTemplateVariadic.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang/lib/Sema/SemaTemplateVariadic.cpp b/clang/lib/Sema/SemaTemplateVariadic.cpp
index c959e0834b9f1..6f31ec41c42d1 100644
--- a/clang/lib/Sema/SemaTemplateVariadic.cpp
+++ b/clang/lib/Sema/SemaTemplateVariadic.cpp
@@ -1215,7 +1215,7 @@ bool Sema::containsUnexpandedParameterPacks(Declarator &D) {
break;
case DeclaratorChunk::Function:
for (unsigned i = 0, e = Chunk.Fun.NumParams; i != e; ++i) {
- auto *Param = dyn_cast_or_null<ParmVarDecl>(Chunk.Fun.Params[i].Param);
+ ParmVarDecl *Param = cast_or_null<ParmVarDecl>(Chunk.Fun.Params[i].Param);
if (!Param)
continue;
QualType ParamTy = Param->getType();
More information about the cfe-commits
mailing list