diff options
Diffstat (limited to 'test/CodeGenObjC/block-var-layout.m')
-rw-r--r-- | test/CodeGenObjC/block-var-layout.m | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/test/CodeGenObjC/block-var-layout.m b/test/CodeGenObjC/block-var-layout.m new file mode 100644 index 0000000..bf9ba8d --- /dev/null +++ b/test/CodeGenObjC/block-var-layout.m @@ -0,0 +1,123 @@ +// RUN: %clang_cc1 -fblocks -fobjc-gc -triple x86_64-apple-darwin -O0 -S %s -o %t-64.s +// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s +// RUN: %clang_cc1 -x objective-c++ -fblocks -fobjc-gc -triple x86_64-apple-darwin -O0 -S %s -o %t-64.s +// RUN: FileCheck -check-prefix LP64 --input-file=%t-64.s %s + +struct S { + int i1; + id o1; + struct V { + int i2; + id o2; + } v1; + int i3; + id o3; +}; + +__weak id wid; +void x(id y) {} +void y(int a) {} + +void f() { + __block int byref_int = 0; + char ch = 'a'; + char ch1 = 'b'; + char ch2 = 'c'; + short sh = 2; + const id bar = (id)0; + id baz = 0; + __strong void *strong_void_sta; + __block id byref_bab = (id)0; + __block void *bl_var1; + int i; double dob; + + void (^b)() = ^{ + byref_int = sh + ch+ch1+ch2 ; + x(bar); + x(baz); + x((id)strong_void_sta); + x(byref_bab); + }; + b(); + +// Test 2 + void (^c)() = ^{ + byref_int = sh + ch+ch1+ch2 ; + x(bar); + x(baz); + x((id)strong_void_sta); + x(wid); + bl_var1 = 0; + x(byref_bab); + }; + c(); + +// Test 3 +void (^d)() = ^{ + byref_int = sh + ch+ch1+ch2 ; + x(bar); + x(baz); + x(wid); + bl_var1 = 0; + y(i + dob); + x(byref_bab); + }; + d(); + +// Test4 + struct S s2; + void (^e)() = ^{ + x(s2.o1); + }; + e(); +} + +// Test 5 (unions/structs and their nesting): +void Test5() { +struct S5 { + int i1; + id o1; + struct V { + int i2; + id o2; + } v1; + int i3; + union UI { + void * i1; + id o1; + int i3; + id o3; + }ui; +}; + +union U { + void * i1; + id o1; + int i3; + id o3; +}ui; + +struct S5 s2; +union U u2; +void (^c)() = ^{ + x(s2.ui.o1); + x(u2.o1); +}; +c(); + +} + +// CHECK-LP64: L_OBJC_CLASS_NAME_: +// CHECK-LP64-NEXT: .asciz "A\024" + +// CHECK-LP64: L_OBJC_CLASS_NAME_1: +// CHECK-LP64-NEXT: .asciz "A\025" + +// CHECK-LP64: L_OBJC_CLASS_NAME_6: +// CHECK-LP64-NEXT: .asciz "A\023!" + +// CHECK-LP64: L_OBJC_CLASS_NAME_11: +// CHECK-LP64-NEXT: .asciz "Q\021\021" + +// CHECK-LP64: L_OBJC_CLASS_NAME_14: +// CHECK-LP64-NEXT: .asciz "Q\021\022p" |