[clang] [Clang] Correctly determine constexprness of dependent lambdas. (PR #124468)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Jan 26 06:25:07 PST 2025
https://github.com/cor3ntin created https://github.com/llvm/llvm-project/pull/124468
We skipped checking if a lambda is constexpr if the parent context was dependent, even if the lambda itself wasn't (and there is no other opportunity to establish constexprness)
>From bf293df31802bdfd6b5fdbdf87b142318a3ce567 Mon Sep 17 00:00:00 2001
From: Corentin Jabot <corentinjabot at gmail.com>
Date: Sun, 26 Jan 2025 15:22:19 +0100
Subject: [PATCH] [Clang] Correctly determine constexprness of dependent
lambdas.
We skipped checking if a lambda is constexpr if the
parent context was dependent, even if the lambda itself wasn't
(and there is no other opportunity to establish constexprness)
---
clang/docs/ReleaseNotes.rst | 1 +
clang/lib/Sema/SemaLambda.cpp | 12 +++++-----
.../test/SemaCXX/cxx1z-constexpr-lambdas.cpp | 24 +++++++++++++++++++
3 files changed, 31 insertions(+), 6 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index e9fffddd507c66..6083efdea09ddb 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -991,6 +991,7 @@ Bug Fixes to C++ Support
- Fixed assertions or false compiler diagnostics in the case of C++ modules for
lambda functions or inline friend functions defined inside templates (#GH122493).
- Clang now rejects declaring an alias template with the same name as its template parameter. (#GH123423)
+- Correctly determine the implicit constexprness of dependent lambdas. (#GH97958) (#GH114234)
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Sema/SemaLambda.cpp b/clang/lib/Sema/SemaLambda.cpp
index 87b3ca53cefaf2..88693dace45e95 100644
--- a/clang/lib/Sema/SemaLambda.cpp
+++ b/clang/lib/Sema/SemaLambda.cpp
@@ -2239,18 +2239,18 @@ ExprResult Sema::BuildLambdaExpr(SourceLocation StartLoc, SourceLocation EndLoc,
Cleanup.mergeFrom(LambdaCleanup);
- LambdaExpr *Lambda = LambdaExpr::Create(Context, Class, IntroducerRange,
- CaptureDefault, CaptureDefaultLoc,
- ExplicitParams, ExplicitResultType,
- CaptureInits, EndLoc,
- ContainsUnexpandedParameterPack);
+ LambdaExpr *Lambda =
+ LambdaExpr::Create(Context, Class, IntroducerRange, CaptureDefault,
+ CaptureDefaultLoc, ExplicitParams, ExplicitResultType,
+ CaptureInits, EndLoc, ContainsUnexpandedParameterPack);
+
// If the lambda expression's call operator is not explicitly marked constexpr
// and we are not in a dependent context, analyze the call operator to infer
// its constexpr-ness, suppressing diagnostics while doing so.
if (getLangOpts().CPlusPlus17 && !CallOperator->isInvalidDecl() &&
!CallOperator->isConstexpr() &&
!isa<CoroutineBodyStmt>(CallOperator->getBody()) &&
- !Class->getDeclContext()->isDependentContext()) {
+ !Class->isDependentContext()) {
CallOperator->setConstexprKind(
CheckConstexprFunctionDefinition(CallOperator,
CheckConstexprKind::CheckValid)
diff --git a/clang/test/SemaCXX/cxx1z-constexpr-lambdas.cpp b/clang/test/SemaCXX/cxx1z-constexpr-lambdas.cpp
index 6a1f48bf7958fd..0c20dd9dc58c63 100644
--- a/clang/test/SemaCXX/cxx1z-constexpr-lambdas.cpp
+++ b/clang/test/SemaCXX/cxx1z-constexpr-lambdas.cpp
@@ -349,3 +349,27 @@ static_assert(OtherCaptures(), "");
} // namespace PR36054
#endif // ndef CPP14_AND_EARLIER
+
+
+#if __cpp_constexpr >= 201907L
+namespace GH114234 {
+template <auto Arg>
+auto g() { return Arg; }
+
+template <typename>
+auto f() {
+ []<typename>() {
+ g<[] { return 123; }()>();
+ }.template operator()<int>();
+}
+
+void test() { f<int>(); }
+}
+
+namespace GH97958 {
+static_assert(
+ []<int I=0>() -> decltype([]{ return true; })
+ { return {}; }()());
+}
+
+#endif
More information about the cfe-commits
mailing list