[cfe-commits] r64994 - in /cfe/trunk/lib: AST/ExprConstant.cpp CodeGen/CGBlocks.cpp CodeGen/CGExprConstant.cpp CodeGen/CGExprScalar.cpp CodeGen/CodeGenModule.h

Chris Lattner clattner at apple.com
Wed Feb 18 20:08:28 PST 2009


On Feb 18, 2009, at 7:22 PM, Mike Stump wrote:

> On Feb 18, 2009, at 7:12 PM, Eli Friedman wrote:
>> On Wed, Feb 18, 2009 at 5:01 PM, Mike Stump <mrs at apple.com> wrote:
>>> --- cfe/trunk/lib/AST/ExprConstant.cpp (original)
>>> +++ cfe/trunk/lib/AST/ExprConstant.cpp Wed Feb 18 19:01:04 2009
>>> @@ -260,6 +260,7 @@
>>> APValue VisitAddrLabelExpr(AddrLabelExpr *E)
>>>     { return APValue(E, 0); }
>>> APValue VisitCallExpr(CallExpr *E);
>>> +  APValue VisitBlockExpr(BlockExpr *E) { return APValue(E, 0); }
>>
>> Aren't there some missing checks here?
>
> Work in progress.  There is all sorts of checking, semantics and
> codegen missing.
>
>> Block expressions can't possibly be constant in general.
>
> They are?!  That is why they are called block literal expressions.  In
> the same way that 1 is a literal and unchanging, ^{} is a literal,
> constant and unchanging.  Now, I could easily have it wrong, it you
> could point out the part you thought would vary, I can contemplate it.

Blocks that capture or otherwise refer to local variables aren't  
constant.  This isn't valid in C for example:

void foo(int X) {

   static void *P = ^{ return X+X; };

}



More information about the cfe-commits mailing list