[PATCH] [C++11] Support for capturing of variable length arrays in lambda expression.

Bataev, Alexey a.bataev at hotmail.com
Mon Jul 21 22:14:04 PDT 2014


Richard, I don't think this is possible. If we storing 
VariableLengthArray* on FieldDecl, then in Lambda operator we can 
access VariableLengthArray->getSizeExpr(). But! We won't be able to get 
the llvm::Value* for this VariableLengthArray->getSizeExpr(), 
calculated in another function. We should pass this llvm::Value* as a 
member of RecordDecl for LambdaExpr! Here is a scheme:

foo() {
int vla[n+m];
....
some_lambda {vla....;}
....
}

What we have in CodeGen for this example:
CodeGenFunction(foo), llvm::DenseMap<const Expr*, llvm::Value*> 
VLASizeMap[n+m]=value; VLASizeMap stores pre-calculated size of each 
VLA.
{
   FD->field_for_m+n_expr = (int [n+m]*)0;
   CodeGenFunction CGF(some_lambda.operator(), FD);
}

CodeGenFunction(some_lambda.operator()), llvm::DenseMap<const Expr*, 
llvm::Value*> VLASizeMap[n+m]=????? - llvm::Value* for 'n+m' is not 
captured here, we don't have an access to 'value', calculated in 
CodeGenFunction(foo) for expression 'n+m'.

To solve this problem we can try to capture 2 fields instead - one for 
VariableLengthArray*, and another one for llvm::Value* calculated for 
VariableLengthArray->getSizeExpr().

Best regards,
Alexey Bataev
=============
Software Engineer
Intel Compiler Team

22 Июль 2014 г. 8:57:54, Richard Smith писал:
> On Mon, Jul 21, 2014 at 5:43 AM, Alexey Bataev <a.bataev at hotmail.com
> <mailto:a.bataev at hotmail.com>> wrote:
>
>     Updated version after last review. Unfortunately, I don't think it
>     is possible to pass captured expression as a VariableLengthArray
>     *. I have to capture expr of VariableLengthArray * and then cast
>     it to SizeExpr->getType() type to make lambda capture this type,
>     not VariableLengthArray *. I have to pass actual value of SizeExpr
>     to the Lambda in this field, because it is defined only in calling
>     function and in Lambda it can be received only in one of captured
>     fields.
>
>
> I don't understand what you're saying. What I'm suggesting is storing
> the VariableLengthArray* in the InitializerOrBitWidth field on
> FieldDecl, instead of storing the array bound there.
>
>     http://reviews.llvm.org/D4368
>
>     Files:
>       include/clang/AST/Decl.h
>       include/clang/AST/LambdaCapture.h
>       include/clang/Basic/DiagnosticSemaKinds.td
>       lib/AST/Decl.cpp
>       lib/AST/Expr.cpp
>       lib/AST/ExprCXX.cpp
>       lib/AST/StmtPrinter.cpp
>       lib/AST/StmtProfile.cpp
>       lib/CodeGen/CGDebugInfo.cpp
>       lib/CodeGen/CGExprCXX.cpp
>       lib/CodeGen/CodeGenFunction.cpp
>       lib/Sema/SemaDecl.cpp
>       lib/Sema/SemaExpr.cpp
>       lib/Sema/TreeTransform.h
>       test/CodeGenCXX/instantiate-typeof-vla.cpp
>       test/SemaTemplate/instantiate-typeof.cpp
>       tools/libclang/IndexBody.cpp
>
>




More information about the cfe-commits mailing list