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

Richard Smith richard at metafoo.co.uk
Tue Jul 22 00:42:37 PDT 2014


On Tue, Jul 22, 2014 at 12:30 AM, Bataev, Alexey <a.bataev at hotmail.com>
wrote:

> Yes, we can do this. I wanted to do like this, but I thought it won't be
> accepted as a kind of a hack again. We're passing Type* as Expr*. I tried
> to avoid such reinterpret castings. But if this solution is acceptable,
> I'll rework the patch in a few minutes.


Please change InitializerOrBitWidth to store a void* rather than casting
the Type* to an Expr*. Other than that, I think this kind of approach is
fine.


> Best regards,
> Alexey Bataev
> =============
> Software Engineer
> Intel Compiler Team
>
> 22 Июль 2014 г. 10:58:11, Richard Smith писал:
>
>> On Mon, Jul 21, 2014 at 10:58 PM, Bataev, Alexey <a.bataev at hotmail.com
>> <mailto:a.bataev at hotmail.com>> wrote:
>>
>>     Richard, yes, I understood that. We have troubles in CodeGen in
>>     this case. Yes, I can call getSizeExpr() for VariableArrayType, by
>>     it is impossible to get llvm::Value* for the expression returned
>>     by getSizeExpr() in lambda operator().
>>
>>
>> You can do this in exactly the same way you do it in your current
>> patch; see attached patch for example.
>>
>>     This value is calculated in parent function for lambda expr and we
>>     have to pass it somehow to lambda. Passing VariableArrayType* does
>>     not allow us to get an access to this value.
>>     We must not recalculate the value of expression from
>>     getSizeExpr(), we must use the value, calculated in parent
>>     function. That's why it is not enough just to pass
>>     VariableArrayType*, also we need to pass llvm::Value* for
>>     getSizeExpr(), calculated in parent function.
>>
>>
>>     Best regards,
>>     Alexey Bataev
>>     =============
>>     Software Engineer
>>     Intel Compiler Team
>>
>>     22 Июль 2014 г. 9:41:43, Richard Smith писал:
>>
>>         On Mon, Jul 21, 2014 at 10:14 PM, Bataev, Alexey
>>         <a.bataev at hotmail.com <mailto:a.bataev at hotmail.com>
>>         <mailto:a.bataev at hotmail.com <mailto: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>
>>         <mailto:a.bataev at hotmail.com <mailto:a.bataev at hotmail.com>>
>>                 <mailto:a.bataev at hotmail.com
>>         <mailto:a.bataev at hotmail.com> <mailto: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/20140722/e1bc68fb/attachment.html>


More information about the cfe-commits mailing list