[PATCH] [C++11] Support for capturing of variable length arrays in lambda expression.
Richard Smith
richard at metafoo.co.uk
Wed Jul 16 17:09:04 PDT 2014
Please add a serialization / deserialization test.
================
Comment at: include/clang/AST/Decl.h:2253-2255
@@ -2255,1 +2252,5 @@
+ /// \brief Determine whether this member has a reference to captured
+ /// expression for structs/classes generates for list of variables captured
+ /// in lambda expressions.
+ bool hasCapturedExpr() const;
----------------
I can't parse this sentence.
================
Comment at: include/clang/AST/Decl.h:2256-2258
@@ +2255,5 @@
+ /// in lambda expressions.
+ bool hasCapturedExpr() const;
+ /// \brief Get the captured expression if any.
+ Expr *getCapturedExpr() const {
+ return hasCapturedExpr() ? InitializerOrBitWidth.getPointer() : nullptr;
----------------
I think this should be made more specific: this actually refers specifically to capturing a VLA bound, so it should be named thusly.
================
Comment at: include/clang/AST/LambdaCapture.h:81
@@ -77,1 +80,3 @@
+ /// \brief Determine whether this captures expression.
+ bool capturesExpression() const {
----------------
"... captures an expression."
================
Comment at: include/clang/AST/LambdaCapture.h:82
@@ +81,3 @@
+ /// \brief Determine whether this captures expression.
+ bool capturesExpression() const {
+ return (DeclAndBits.getPointer() == nullptr) &&
----------------
Please make this instead be `capturesVLABound`, since that's what it's for.
================
Comment at: lib/AST/Decl.cpp:3265-3269
@@ +3264,7 @@
+ InitializerOrBitWidth.getPointer()) {
+ if (getDeclContext() && getDeclContext()->isRecord()) {
+ if (auto *RD = dyn_cast<CXXRecordDecl>(getParent())) {
+ return !RD->isLambda();
+ }
+ }
+ return true;
----------------
Please update the comment for `InitializerOrBitWidth` to describe what you're doing here.
================
Comment at: lib/AST/Decl.cpp:3333
@@ +3332,3 @@
+ "bit width, initializer or captured expr already set");
+ InitializerOrBitWidth.setPointer(CapturedExpr);
+}
----------------
It's not really safe to track the captured expression like this: we don't guarantee to preserve expression pointer equality across serialization and deserialization if the expression is reachable from multiple parents, as this one will be.
Instead, how about passing in and storing a `VariableArrayType` here?
http://reviews.llvm.org/D4368
More information about the cfe-commits
mailing list