[clang] 1908d4c - [clang][Interp] Reject static lambdas with captures (#74718)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Dec 12 02:08:42 PST 2023
Author: Timm Baeder
Date: 2023-12-12T11:08:38+01:00
New Revision: 1908d4cda6760d2c9b28d8bbb4a5b7eeb9697c96
URL: https://github.com/llvm/llvm-project/commit/1908d4cda6760d2c9b28d8bbb4a5b7eeb9697c96
DIFF: https://github.com/llvm/llvm-project/commit/1908d4cda6760d2c9b28d8bbb4a5b7eeb9697c96.diff
LOG: [clang][Interp] Reject static lambdas with captures (#74718)
Static lambdas cannot have captures. They may still end up in the
constant evaluator though. They've been diagnosted appropriately before,
so just reject them here.
This is similar to #74661, but for the new constant expression
interpreter.
Added:
Modified:
clang/lib/AST/Interp/ByteCodeEmitter.cpp
clang/test/AST/Interp/cxx23.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/ByteCodeEmitter.cpp b/clang/lib/AST/Interp/ByteCodeEmitter.cpp
index 89b7708c0c2a12..045263447cbc91 100644
--- a/clang/lib/AST/Interp/ByteCodeEmitter.cpp
+++ b/clang/lib/AST/Interp/ByteCodeEmitter.cpp
@@ -61,6 +61,11 @@ ByteCodeEmitter::compileFunc(const FunctionDecl *FuncDecl) {
MD->getParent()->getCaptureFields(LC, LTC);
for (auto Cap : LC) {
+ // Static lambdas cannot have any captures. If this one does,
+ // it has already been diagnosed and we can only ignore it.
+ if (MD->isStatic())
+ return nullptr;
+
unsigned Offset = R->getField(Cap.second)->Offset;
this->LambdaCaptures[Cap.first] = {
Offset, Cap.second->getType()->isReferenceType()};
diff --git a/clang/test/AST/Interp/cxx23.cpp b/clang/test/AST/Interp/cxx23.cpp
index e284a66626fb33..bd1cf186d519c5 100644
--- a/clang/test/AST/Interp/cxx23.cpp
+++ b/clang/test/AST/Interp/cxx23.cpp
@@ -4,9 +4,6 @@
// RUN: %clang_cc1 -std=c++23 -fsyntax-only -fcxx-exceptions -verify=expected23 %s -fexperimental-new-constant-interpreter
-// expected23-no-diagnostics
-
-
/// FIXME: The new interpreter is missing all the 'control flows through...' diagnostics.
constexpr int f(int n) { // ref20-error {{constexpr function never produces a constant expression}} \
@@ -82,3 +79,27 @@ constexpr int k(int n) {
return m;
}
constexpr int k0 = k(0);
+
+namespace StaticLambdas {
+ constexpr auto static_capture_constexpr() {
+ char n = 'n';
+ return [n] static { return n; }(); // expected23-error {{a static lambda cannot have any captures}} \
+ // expected20-error {{a static lambda cannot have any captures}} \
+ // expected20-warning {{are a C++23 extension}} \
+ // expected20-warning {{is a C++23 extension}} \
+ // ref23-error {{a static lambda cannot have any captures}} \
+ // ref20-error {{a static lambda cannot have any captures}} \
+ // ref20-warning {{are a C++23 extension}} \
+ // ref20-warning {{is a C++23 extension}}
+ }
+ static_assert(static_capture_constexpr()); // expected23-error {{static assertion expression is not an integral constant expression}} \
+ // expected20-error {{static assertion expression is not an integral constant expression}} \
+ // ref23-error {{static assertion expression is not an integral constant expression}} \
+ // ref20-error {{static assertion expression is not an integral constant expression}}
+
+ constexpr auto capture_constexpr() {
+ char n = 'n';
+ return [n] { return n; }();
+ }
+ static_assert(capture_constexpr());
+}
More information about the cfe-commits
mailing list