[cfe-commits] [PATCH] Sema and AST for C++0x Lambda Expressions

Douglas Gregor dgregor at apple.com
Thu Oct 20 11:03:24 PDT 2011


On Oct 17, 2011, at 9:30 AM, Douglas Gregor wrote:

> 
> On Oct 15, 2011, at 8:21 PM, John Freeman wrote:
> 
>>> +  /// Declaration for the closure type.
>>> +  CXXRecordDecl *ClosureType;
>>> 
>>> This is just getType()->getAsCXXRecordDecl(), no?
>> 
>> To my knowledge, yes it is. I added the ClosureType member simply for caching. I saw you removed it. The same could be done for the Function member as well. Is the general policy to keep the AST classes as small as possible?
> 
> Yes, absolutely. Memory footprint is extremely important when compiling C++ code, so we try to keep our data structures small. We'll use extra storage if it provides a significant performance improvement, of course, but that's not likely the case here.
> 
>>> +  /// The temporary object resulting from evaluating the lambda expression,
>>> +  /// represented by a call to the constructor of the closure type.
>>> +  CXXConstructExpr *ClosureObject;
>>> 
>>> This makes me think that LambdaExpr should just be a subclass of CXXConstructExpr, because there's a lot of behavior we get "for free" for lambdas if it derives from CXXConstructExpr (such as proper handling of the temporary). It would require some twisting-around of the logic for building lambda expressions (in particular, the LambdaExpr wouldn't be built until the whole body had been parsed), but I think the result would be better.
>> 
>> How should we store the bits and pieces up until the body has been parsed? Should there be a separate data structure just to hold them that gets passed between Sema functions, or should there be members within Sema for things like CurLambdaIntroducer and CurLambdaMethod, or something else?
> 
> 
> Check out BlockScopeInfo; you'll want something like that, to keep the stack of active lambdas available. It'll become extremely important once you start handling implicit captures.

FWIW, I hacked on your prior lambdas patch a bit to start adding a LambdaScopeInfo. I won't have any time to hack on lambdas further for quite a while, so I'm attaching the patch---in it's broken but perhaps instructive state---here.

	- Doug

-------------- next part --------------
A non-text attachment was scrubbed...
Name: lambdas.patch
Type: application/octet-stream
Size: 48058 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20111020/97197072/attachment.obj>


More information about the cfe-commits mailing list