On Feb 18, 2009, at 7:41 PM, Eli Friedman wrote: > On Wed, Feb 18, 2009 at 7:22 PM, Mike Stump <[email protected]> wrote: >> On Feb 18, 2009, at 7:12 PM, Eli Friedman wrote: >>> >>> On Wed, Feb 18, 2009 at 5:01 PM, Mike Stump <[email protected]> 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. > > That's fine, but it would be nice to at least put in a FIXME for the > missing checks. > >>> 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. > > Hmm, I might be confused about something, but take something like the > following (I haven't checked if this particular example compiles, but > this sort of thing is legal): > int a(int x) { > static int (^y)(void) = ^{x;}; > return y(); > } > > This initializer for y must be illegal because it can't be evaluated > at compile-time: the returned value changes! Therefore, blocks aren't > constant in the general case. > > I believe that file-scope block expressions are constant, but you need > some way to check that; the use of isFileScope for compund literals > would be a good example to follow.
Heh, yeah, what Eli said :) -Chris _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
