Automatic initialization [1] of __block variables was trampling over the block's headers after they'd been initialized, which caused self-init usage to crash, such as here:
typedef struct XYZ { void (^block)(); } *xyz_t; __attribute__((noinline)) xyz_t create(void (^block)()) { xyz_t myself = malloc(sizeof(struct XYZ)); myself->block = block; return myself; } int main() { __block xyz_t captured = create(^(){ (void)captured; }); }
This type of code shouldn't be broken by variable auto-init, even if it's sketchy.
[1] With -ftrivial-auto-var-init=pattern
rdar://problem/47798396
Are these changes still needed?