[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