[PATCH] D146030: [clang][Interp] Handle LambdaExprs
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri May 5 11:35:04 PDT 2023
aaron.ballman added inline comments.
================
Comment at: clang/lib/AST/Interp/ByteCodeEmitter.cpp:56-57
+ const Record *R = P.getOrCreateRecord(MD->getParent());
+ llvm::DenseMap<const ValueDecl *, FieldDecl *> _LambdaCaptures;
+ FieldDecl *_LambdaThisCapture;
+
----------------
UB alert -- `_L` is reserved; let's pick names without leading underscores or shadowing.
================
Comment at: clang/lib/AST/Interp/ByteCodeEmitter.h:73-74
llvm::DenseMap<const ParmVarDecl *, unsigned> Params;
+ /// Lambda captures.
+ llvm::DenseMap<const ValueDecl *, std::pair<unsigned, bool>> LambdaCaptures;
+ unsigned *LambdaThisCapture;
----------------
Can you add comments explaining what the `unsigned, bool` pair is encoding?
================
Comment at: clang/lib/AST/Interp/ByteCodeEmitter.h:75
+ llvm::DenseMap<const ValueDecl *, std::pair<unsigned, bool>> LambdaCaptures;
+ unsigned *LambdaThisCapture;
/// Local descriptors.
----------------
Why is this a pointer? Since it's not really implemented, I'd recommend removing this for now and adding it back when you add support for capturing `this`.
================
Comment at: clang/test/AST/Interp/lambda.cpp:92
+ static_assert(foo() == 1); // expected-error {{not an integral constant expression}}
+}
+
----------------
How about some tests like:
```
constexpr int call_thru_func_ptr(int i) {
auto l = [](int i) { return i; };
int (*fp)(int) = l;
return fp(i);
}
static_assert(call_thru_func_ptr(12) == 12);
constexpr int call_through_copied_lambda(auto lam, int i) {
auto copy = lam;
return copy(i);
}
constexpr int call_through_copied_lambda(auto lam) {
auto copy = lam;
return copy();
}
void func() {
constexpr int i = 12;
static_assert(call_through_copied_lambda([i]() { return i; }) == 12);
}
```
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D146030/new/
https://reviews.llvm.org/D146030
More information about the cfe-commits
mailing list