[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