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

Richard Smith richard at metafoo.co.uk
Mon Jul 21 22:41:43 PDT 2014


On Mon, Jul 21, 2014 at 10:14 PM, Bataev, Alexey <a.bataev at hotmail.com>
wrote:

> 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().


I'm sorry, I still think we're miscommunicating. What I'm suggesting is a
mechanical transformation: store the VariableArrayType* on the FieldDecl,
and then when you need the size expression that you're currently storing
there, call getSizeExpr() on the type.


> 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
>>
>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140721/e99d8d82/attachment.html>


More information about the cfe-commits mailing list