[cfe-dev] Bug in block parsing

David Yoo dyoo1 at umiacs.umd.edu
Sun Sep 6 11:03:20 PDT 2009

Normally, compiling a function that returns a block that references  
stack variables, such as:

int (^stack_block(void))(void)
     int stack_var;
     return ^{ return stack_var; };

...will fail with "error: returning block that lives on the local  
stack," which is desired. However, wrapping the return statement in  
parentheses will suppress this error and compile in clang (both  
release and repository):

     return (^{ return stack_var; });

gcc 4.2.1's error message is unaffected by the added parentheses.

On a small unrelated matter, the BlockLanguageSpec gives some examples  
for block literal declarations, including the following:

     typedef int (*pointerToFunctionThatReturnsIntWithCharArg)(char);
     pointerToFunctionThatReturnsIntWithCharArg functionPointer;

     ^ pointerToFunctionThatReturnsIntWithCharArg (float x) { return  
functionPointer; }
     ^ int ((*)(float x))(char) { return functionPointer; }

...where the two blocks should be synonymous. This doesn't appear to  
be the case; the second declaration should be:

     ^ int (*(float x))(char) { return functionPointer; }

More information about the cfe-dev mailing list