block-global-byref-2.c   [plain text]


/* APPLE LOCAL file radar 6014138 */
/* Test use of __block on locals which will be used as 'byref' variables in blocks. */
/* { dg-do run { target *-*-darwin[1-2][0-9]* } } */
/* { dg-options "-mmacosx-version-min=10.5 -fblocks" { target *-*-darwin* } } */
/* { dg-skip-if "" { powerpc*-*-darwin* } { "-m64" } { "" } } */

#include <stdio.h>
void * _NSConcreteStackBlock;
void _Block_byref_assign_copy(void * dst, void *src){}
void _Block_byref_release(void*src){}

void CallBlock (void (^voidvoidBlock)(void)) {
   voidvoidBlock();
}


int foo() {
    __block int local_byref_1 = 10;
    __block int local_byref_2 = 10;
    __block int local_byref_3 = 10;

    CallBlock( ^ { ++local_byref_1; ++local_byref_2; ++local_byref_3; 
	          CallBlock(^ { ++local_byref_1; ++local_byref_2; ++local_byref_3; }); 
		  ++local_byref_1; ++local_byref_2; ++local_byref_3; });

    if (local_byref_1 != 13 || local_byref_2 != 13 || local_byref_3 != 13)
      return 1;
    return 0;
}

int main()
{
  return foo ();
}