https://github.com/xakep8 updated 
https://github.com/llvm/llvm-project/pull/237969

>From a361843f242adaec7b0d3dcf8502a1244d8a7e9d Mon Sep 17 00:00:00 2001
From: Kunal Dubey <[email protected]>
Date: Mon, 2 Nov 2026 18:59:39 +0530
Subject: [PATCH 1/2] [Clang] Fix crashes in coroutine pack expansions

Clang could crash when co_yield or co_await used a parameter pack inside
a fold expression like ((void)(co_yield Values),...);

Fixed the expression handling so these packs expand correctly. Also
added tests for co_yield, co_await and other cases along with negative
tests.
---
 clang/lib/AST/ComputeDependence.cpp           |  4 +-
 .../test/SemaCXX/coroutine-pack-expansion.cpp | 48 +++++++++++++++++++
 .../opaque-value-pack-expansion.cpp           | 15 ++++++
 3 files changed, 66 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/SemaCXX/coroutine-pack-expansion.cpp
 create mode 100644 clang/test/SemaTemplate/opaque-value-pack-expansion.cpp

diff --git a/clang/lib/AST/ComputeDependence.cpp 
b/clang/lib/AST/ComputeDependence.cpp
index c4bf3681a79122..6a65b417a4c758 100644
--- a/clang/lib/AST/ComputeDependence.cpp
+++ b/clang/lib/AST/ComputeDependence.cpp
@@ -27,8 +27,10 @@ ExprDependence clang::computeDependence(FullExpr *E) {
 
 ExprDependence clang::computeDependence(OpaqueValueExpr *E) {
   auto D = toExprDependenceForImpliedType(E->getType()->getDependence());
+  // An OpaqueValueExpr has no syntactic children, so it does not contain an
+  // unexpanded pack even if its source does.
   if (auto *S = E->getSourceExpr())
-    D |= S->getDependence();
+    D |= S->getDependence() & ~ExprDependence::UnexpandedPack;
   assert(!(D & ExprDependence::UnexpandedPack));
   return D;
 }
diff --git a/clang/test/SemaCXX/coroutine-pack-expansion.cpp 
b/clang/test/SemaCXX/coroutine-pack-expansion.cpp
new file mode 100644
index 00000000000000..a2478c8975211a
--- /dev/null
+++ b/clang/test/SemaCXX/coroutine-pack-expansion.cpp
@@ -0,0 +1,48 @@
+// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s
+
+#include "Inputs/std-coroutine.h"
+
+struct Awaiter {
+  int Value;
+
+  bool await_ready();
+  void await_suspend(std::coroutine_handle<>);
+  int await_resume();
+};
+
+struct Task {
+  struct promise_type {
+    Task get_return_object();
+    std::suspend_never initial_suspend() noexcept;
+    std::suspend_never final_suspend() noexcept;
+    Awaiter yield_value(int Value);
+    void return_void();
+    void unhandled_exception();
+  };
+};
+
+template <int... Values>
+Task yieldPack() {
+  ((void)(co_yield Values), ...);
+}
+
+template Task yieldPack<1, 2, 3>();
+template Task yieldPack<>();
+
+template <int... Values>
+Task awaitPack() {
+  ((void)(co_await Awaiter{Values}), ...);
+}
+
+template Task awaitPack<1, 2, 3>();
+template Task awaitPack<>();
+
+template <int... Values>
+Task unexpandedYield() {
+  co_yield Values; // expected-error {{expression contains unexpanded 
parameter pack 'Values'}}
+}
+
+template <int... Values>
+Task unexpandedAwait() {
+  co_await Awaiter{Values}; // expected-error {{expression contains unexpanded 
parameter pack 'Values'}}
+}
diff --git a/clang/test/SemaTemplate/opaque-value-pack-expansion.cpp 
b/clang/test/SemaTemplate/opaque-value-pack-expansion.cpp
new file mode 100644
index 00000000000000..6a0861c84deb71
--- /dev/null
+++ b/clang/test/SemaTemplate/opaque-value-pack-expansion.cpp
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 -std=gnu++17 -fsyntax-only -verify %s
+
+template <typename... T>
+void conditionalPack(T... Values) {
+  ((void)(Values ?: 0), ...);
+}
+
+template void conditionalPack<int, int, int>(int, int, int);
+
+template <typename... T>
+void unexpandedPack(T... Values) {
+  (void)(Values ?: 0); // expected-error {{expression contains unexpanded 
parameter pack 'Values'}}
+}
+
+template void unexpandedPack<int, int, int>(int, int, int);

>From 7bee81e972c3b756e5b9b9e827994baa4578e047 Mon Sep 17 00:00:00 2001
From: Kunal Dubey <[email protected]>
Date: Mon, 2 Nov 2026 20:17:17 +0530
Subject: [PATCH 2/2] [Clang] Added Release Note

---
 clang/docs/ReleaseNotes.md | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/clang/docs/ReleaseNotes.md b/clang/docs/ReleaseNotes.md
index 52fa928443f347..96931c6043b1ae 100644
--- a/clang/docs/ReleaseNotes.md
+++ b/clang/docs/ReleaseNotes.md
@@ -1038,6 +1038,9 @@ documentation](CIR/index.md) for more information 
regarding ClangIR's status and
   dependent `co_return` operand that inits to `void`, instead of using
   `promise.return_void()`. (#GH218368)
 
+- Fixed a crash when `co_yield`, `co_await`, or GNU `?:` expressions used
+  parameter packs. (#GH162198)
+
 - Fixed merging of lambdas across modules in the case where neither lambda is
   imported from an AST file. (#GH214560)
 

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to