block-nested.C   [plain text]


/* APPLE LOCAL file radar 5732232 - blocks */
/* { dg-do run { target *-*-darwin[1-2][0-9]* } } */
/* { dg-options "-mmacosx-version-min=10.6 -fblocks" } */
/* { dg-skip-if "" { powerpc*-*-darwin* } { "-m64" } { "" } } */

#include <stdio.h>
void * _NSConcreteStackBlock;
#ifdef __cplusplus
extern "C" void exit(int);
#else
extern void exit(int);
#endif

enum numbers {
  zero, one, two, three, four
};

typedef enum numbers (^myblock)(enum numbers);


double test(myblock I) {
  return I(three);
}

int main() {
  __block enum numbers x = one;
  __block enum numbers y = two;

  myblock CL = ^(enum numbers z)
		{ enum numbers savex = x;
		  { __block enum numbers x = savex;
		  y = z;
		  if (y != three)
		    exit (6);
		  test (
			^ (enum numbers z) {
			    if (y != three) {
			      exit(1);
			    }
			    if (x != one)
			      exit(2);
			    x = z;
			    if (x != three)
			      exit(3);
			    if (y != three)
			      exit(4);
			    return (enum numbers) four;
			});}
		  return x;
		  };

  enum numbers res = (enum numbers)test(CL);

  if (res != one)
    exit (5);
  return 0;
}