[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