[cfe-commits] r149977 - in /cfe/trunk: include/clang/AST/ include/clang/Basic/ include/clang/Sema/ lib/AST/ lib/Sema/ lib/Serialization/ lib/StaticAnalyzer/Core/ test/CXX/expr/expr.prim/expr.prim.lambda/ tools/libclang/

Eli Friedman eli.friedman at gmail.com
Tue Feb 7 15:16:59 PST 2012


On Tue, Feb 7, 2012 at 2:09 AM, Douglas Gregor <dgregor at apple.com> wrote:
> Author: dgregor
> Date: Tue Feb  7 04:09:13 2012
> New Revision: 149977
>
> URL: http://llvm.org/viewvc/llvm-project?rev=149977&view=rev
> Log:
> Introduce basic ASTs for lambda expressions. This covers:
>  - Capturing variables by-reference and by-copy within a lambda
>  - The representation of lambda captures
>  - The creation of the non-static data members in the lambda class
>  that store the captured variables
>  - The initialization of the non-static data members from the
>  captured variables
>  - Pretty-printing lambda expressions

[...]

> +LambdaExpr::LambdaExpr(QualType T,
> +                       SourceRange IntroducerRange,
> +                       LambdaCaptureDefault CaptureDefault,
> +                       ArrayRef<Capture> Captures,
> +                       bool ExplicitParams,
> +                       ArrayRef<Expr *> CaptureInits,
> +                       SourceLocation ClosingBrace)
> +  : Expr(LambdaExprClass, T, VK_RValue, OK_Ordinary,
> +         T->isDependentType(), T->isDependentType(), T->isDependentType(),
> +         /*ContainsUnexpandedParameterPack=*/false),
> +    IntroducerRange(IntroducerRange),
> +    NumCaptures(Captures.size()),
> +    NumExplicitCaptures(0),
> +    CaptureDefault(CaptureDefault),
> +    ExplicitParams(ExplicitParams),
> +    ClosingBrace(ClosingBrace)
> +{
> +  assert(CaptureInits.size() == Captures.size() && "Wrong number of arguments");
> +
> +  // Copy captures.
> +  // FIXME: Do we need to update "contains unexpanded parameter pack" here?

We do if we support expanding lambdas as part of a parameter pack...

> @@ -9654,10 +9720,10 @@
>       // According to the blocks spec, the capture of a variable from
>       // the stack requires a const copy constructor.  This is not true
>       // of the copy/move done to move a __block variable to the heap.
> -      // There is no equivalent language in the C++11 specification of lambdas.
> -      if (isBlock)
> -        type.addConst();
> +      type.addConst();
>
> +      // FIXME: Add an initialized entity for lambda capture.
> +      // FIXME: Won't work for arrays, although we do need this behavior.
>       Expr *declRef = new (Context) DeclRefExpr(var, type, VK_LValue, loc);
>       ExprResult result =
>         PerformCopyInitialization(

Are these two FIXME's relevant?  Lambdas don't use this codepath with
your patch, and we don't allow capturing arrays in blocks.

-Eli




More information about the cfe-commits mailing list