diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 7a131cb520aa6..74358219ba9fb 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -553,6 +553,8 @@ Bug Fixes in This Version Fixes (`#67687 `_) - Fix crash from constexpr evaluator evaluating uninitialized arrays as rvalue. Fixes (`#67317 `_) +- Fixed an issue that a benign assertion might hit when instantiating a pack expansion + inside a lambda. (`#61460 `_) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaTemplateVariadic.cpp b/clang/lib/Sema/SemaTemplateVariadic.cpp index dfcc78dafdc4c..0f4e9e7f94c81 100644 --- a/clang/lib/Sema/SemaTemplateVariadic.cpp +++ b/clang/lib/Sema/SemaTemplateVariadic.cpp @@ -402,6 +402,13 @@ bool Sema::DiagnoseUnexpandedParameterPack(Expr *E, if (!E->containsUnexpandedParameterPack()) return false; + // CollectUnexpandedParameterPacksVisitor does not expect to see a + // FunctionParmPackExpr, but diagnosing unexpected parameter packs may still + // see such an expression in a lambda body. + // We'll bail out early in this case to avoid triggering an assertion. + if (isa(E) && getEnclosingLambda()) + return false; + SmallVector Unexpanded; CollectUnexpandedParameterPacksVisitor(Unexpanded).TraverseStmt(E); assert(!Unexpanded.empty() && "Unable to find unexpanded parameter packs"); diff --git a/clang/test/SemaCXX/pr61460.cpp b/clang/test/SemaCXX/pr61460.cpp new file mode 100644 index 0000000000000..471b1b39d23c2 --- /dev/null +++ b/clang/test/SemaCXX/pr61460.cpp @@ -0,0 +1,13 @@ +// RUN: %clang_cc1 -std=c++17 %s -fsyntax-only -verify + +template void g(Ts... p1s) { + (void)[&](auto... p2s) { ([&] { p1s; p2s; }, ...); }; +} + +void f1() { + g(); +} + +template void g2(Ts... p1s) { + (void)[&](auto... p2s) { [&] { p1s; p2s; }; }; // expected-error {{expression contains unexpanded parameter pack 'p2s'}} +}