[clang] Don't mark lambda non-dependent if nested in a generic lambda. (PR #149121)
Daniel M. Katz via cfe-commits
cfe-commits at lists.llvm.org
Sat Nov 22 07:16:04 PST 2025
https://github.com/katzdm updated https://github.com/llvm/llvm-project/pull/149121
>From 438c36861938991d1e8d750dea448e79d5d41813 Mon Sep 17 00:00:00 2001
From: Dan Katz <katzdm at gmail.com>
Date: Wed, 16 Jul 2025 11:25:23 -0400
Subject: [PATCH 1/2] Don't mark lambda non-dependent if nested in a generic
lambda.
Fixes #118187.
---
clang/docs/ReleaseNotes.rst | 1 +
clang/lib/Sema/TreeTransform.h | 2 ++
clang/test/SemaCXX/cxx2a-consteval.cpp | 11 ++++++++++-
3 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 63930f43c25e3..a0599f667fd9e 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -557,6 +557,7 @@ Bug Fixes to C++ Support
- Diagnose unresolved overload sets in non-dependent compound requirements. (#GH51246) (#GH97753)
- Fix a crash when extracting unavailable member type from alias in template deduction. (#GH165560)
- Fix incorrect diagnostics for lambdas with init-captures inside braced initializers. (#GH163498)
+- Fixed spurious diagnoses of certain nested lambda expressions. (#GH149121)
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index c2491489f40d2..0e8b674a006d0 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -15628,6 +15628,8 @@ TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
DC = DC->getParent();
if ((getSema().isUnevaluatedContext() ||
getSema().isConstantEvaluatedContext()) &&
+ !(dyn_cast_or_null<CXXRecordDecl>(DC->getParent()) &&
+ cast<CXXRecordDecl>(DC->getParent())->isGenericLambda()) &&
(DC->isFileContext() || !DC->getParent()->isDependentContext()))
DependencyKind = CXXRecordDecl::LDK_NeverDependent;
diff --git a/clang/test/SemaCXX/cxx2a-consteval.cpp b/clang/test/SemaCXX/cxx2a-consteval.cpp
index 1474c48cda3c1..ca28d48f5366e 100644
--- a/clang/test/SemaCXX/cxx2a-consteval.cpp
+++ b/clang/test/SemaCXX/cxx2a-consteval.cpp
@@ -1319,6 +1319,15 @@ namespace GH139160{
B result = (B){10, get_value(make_struct())}; // expected-error {{initializer element is not a compile-time constant}}
// expected-error at -1 {{call to consteval function 'GH139160::get_value' is not a constant expression}}
// expected-note at -2 {{non-constexpr function 'make_struct' cannot be used in a constant expression}}
-};
+} // namespace GH139160
+
+namespace GH118187 {
+template <typename T> int t() {
+ return []<typename U>() consteval {
+ return [](U v) { return v; }(123);
+ }.template operator()<int>();
+}
+int v = t<int>();
+} // namespace GH118187
>From 17a98f9711e5ea7bc14d8d63069b77363d90445b Mon Sep 17 00:00:00 2001
From: Dan Katz <katzdm at gmail.com>
Date: Sat, 22 Nov 2025 10:15:25 -0500
Subject: [PATCH 2/2] Adding test from #156579.
---
clang/test/SemaCXX/cxx2a-consteval.cpp | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/clang/test/SemaCXX/cxx2a-consteval.cpp b/clang/test/SemaCXX/cxx2a-consteval.cpp
index ca28d48f5366e..92bfa40caec4e 100644
--- a/clang/test/SemaCXX/cxx2a-consteval.cpp
+++ b/clang/test/SemaCXX/cxx2a-consteval.cpp
@@ -1331,3 +1331,15 @@ template <typename T> int t() {
int v = t<int>();
} // namespace GH118187
+
+namespace GH156579 {
+template <class>
+auto f{[] (auto...) {
+ if constexpr ([] (auto) { return true; }(0))
+ return 0;
+}};
+
+void g() {
+ f<int>();
+}
+} // namespace GH156579
More information about the cfe-commits
mailing list