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
