ObjC block code crashes when not enabling optimisations

I’ll admit I’m extraordinarily bad at Objective-C, but is there any reason that this piece of code crashes when not explicitly enabling optimization on macOS?

#import <Foundation/Foundation.h>
NSArray* gooo(){
int val=10;
return [[NSArray alloc] initWithObjects:^{NSLog(@"%d",val);},^{NSLog(@"%d",val);},nil];

int main(int argc, char const *argv[]) {
for(id blk in gooo()){
return 0;

CFE has following version info:

~/Downloads/clang+llvm-8.0.0-x86_64-apple-darwin/bin/clang -v

clang version 8.0.0 (tags/RELEASE_800/final)

Target: x86_64-apple-darwin18.2.0

Thread model: posix

Then when I do:

clang 123.m -fobjc-arc -O0 or clang 123.m -fobjc-arc -O1

I get various sort of crash like the following:

2019-05-15 10:41:04.873 a.out[12425:668511] <__NSMallocBlock__: 0x7f8c464035a0>

[1] 12425 segmentation fault ./a.out 0O1


2019-05-15 10:40:59.454 a.out[12412:668167] <__NSMallocBlock__: 0x7f8824e03690>

objc[12412]: Attempt to use unknown class 0x7f8824e00000.

[1] 12412 abort ./a.out 0O1

However, when I turn on optimization with O2 or -O3

clang 123.m -fobjc-arc -O2

2019-05-15 10:41:09.236 a.out[12435:668774] <__NSMallocBlock__: 0x7f8713505290>

2019-05-15 10:41:09.236 a.out[12435:668774] <__NSStackBlock__: 0x7ffee67c45e8>

Initially I thought it was some issue related to missing objc_blockCopy, however after reading through the LLVM assembly I realized that either case only one of the two blocks used as argument are copied. So at this point I’m very lost