1// RUN: %clang_cc1 -fblocks -triple x86_64-apple-darwin -fobjc-runtime=macosx-fragile-10.5 -emit-llvm -o - %s | FileCheck %s 2// rdar: // 8390455 3 4// CHECK: @ArrayRecurs = internal global 5// CHECK: @FUNC.ArrayRecurs = internal global 6// CHECK: @FUNC.ArrayRecurs.1 = internal global 7// CHECK: @FUNC1.ArrayRecurs = internal global 8 9@class NSArray; 10 11static NSArray *(^ArrayRecurs)(NSArray *addresses, unsigned long level) = ^(NSArray *addresses, unsigned long level) { 12 13 for(id rawAddress in addresses) 14 { 15 NSArray *separatedAddresses = ((NSArray*)0); 16 separatedAddresses = ArrayRecurs((NSArray *)rawAddress, level+1); 17 } 18 return (NSArray *)0; 19}; 20 21extern NSArray *address; 22extern unsigned long level; 23 24void FUNC() 25{ 26 ArrayRecurs(address, level); 27 28 static NSArray *(^ArrayRecurs)(NSArray *addresses, unsigned long level) = ^(NSArray *addresses, unsigned long level) { 29 30 for(id rawAddress in addresses) 31 { 32 NSArray *separatedAddresses = ((NSArray*)0); 33 separatedAddresses = ArrayRecurs((NSArray *)rawAddress, level+1); 34 } 35 return (NSArray *)0; 36 }; 37 ArrayRecurs(address, level); 38 39 if (ArrayRecurs) { 40 static NSArray *(^ArrayRecurs)(NSArray *addresses, unsigned long level) = ^(NSArray *addresses, unsigned long level) { 41 42 for(id rawAddress in addresses) 43 { 44 NSArray *separatedAddresses = ((NSArray*)0); 45 separatedAddresses = ArrayRecurs((NSArray *)rawAddress, level+1); 46 } 47 return (NSArray *)0; 48 }; 49 ArrayRecurs(address, level); 50 } 51} 52 53void FUNC2() { 54 static void (^const block1)(int) = ^(int a){ 55 if (a--) 56 block1(a); 57 }; 58} 59 60// CHECK-LABEL: define void @FUNC2( 61// CHECK: define internal void @_block_invoke{{.*}}( 62// CHECK: call void %{{.*}}(i8* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor* }* @__block_literal_global{{.*}} to i8*), i32 %{{.*}}) 63 64void FUNC1() 65{ 66 static NSArray *(^ArrayRecurs)(NSArray *addresses, unsigned long level) = ^(NSArray *addresses, unsigned long level) { 67 68 for(id rawAddress in addresses) 69 { 70 NSArray *separatedAddresses = ((NSArray*)0); 71 separatedAddresses = ArrayRecurs((NSArray *)rawAddress, level+1); 72 } 73 return (NSArray *)0; 74 }; 75 ArrayRecurs(address, level); 76} 77