1 | // RUN: %clang_cc1 -x objective-c++ -fblocks -triple x86_64-apple-darwin -fobjc-runtime=macosx-fragile-10.5 %s -verify -std=c++11 -emit-llvm -o %t |
2 | // rdar://8979379 |
3 | |
4 | @interface A |
5 | @end |
6 | |
7 | @interface B : A |
8 | @end |
9 | |
10 | void f(int (^bl)(B* b)); |
11 | void takeBlock(void (^block)()); |
12 | void useValues(...); |
13 | |
14 | // Test1 |
15 | void g() { |
16 | f(^(A* a) { return 0; }); |
17 | } |
18 | |
19 | // Test2 |
20 | void g1() { |
21 | int (^bl)(B* b) = ^(A* a) { return 0; }; |
22 | } |
23 | |
24 | // Test3 |
25 | @protocol NSObject; |
26 | |
27 | void bar(id(^)(void)); |
28 | |
29 | void foo(id <NSObject>(^objectCreationBlock)(void)) { |
30 | return bar(objectCreationBlock); |
31 | } |
32 | |
33 | // Test4 |
34 | struct S { |
35 | S *(^a)() = ^{ |
36 | return this; |
37 | }; |
38 | }; |
39 | S s; |
40 | |
41 | // Test5 |
42 | struct X { |
43 | void f() { |
44 | ^ { |
45 | struct Nested { Nested *ptr = this; }; |
46 | } (); |
47 | }; |
48 | }; |
49 | |
50 | // Regression test for PR13314 |
51 | class FooClass { }; |
52 | void fun() { |
53 | FooClass foovar; |
54 | ^() { // expected-warning {{expression result unused}} |
55 | return foovar; |
56 | }; |
57 | } |
58 | void gun() { |
59 | FooClass foovar; |
60 | [=]() { // expected-warning {{expression result unused}} |
61 | return foovar; |
62 | }; |
63 | } |
64 | |
65 | // PR24780 |
66 | class CaptureThisAndAnotherPointer { |
67 | void test(void *ptr) { |
68 | takeBlock(^{ useValues(ptr, this); }); |
69 | } |
70 | }; |
71 | |
72 | // rdar://problem/23713871 |
73 | // Check that we don't crash when using BLOCK_LAYOUT_STRONG. |
74 | #pragma clang assume_nonnull begin |
75 | @interface NSUUID @end |
76 | #pragma clang assume_nonnull end |
77 | |
78 | struct Wrapper1 { NSUUID *Ref; }; |
79 | struct Wrapper2 { Wrapper1 W1; }; |
80 | |
81 | @implementation B |
82 | - (void) captureStrongRef { |
83 | __block Wrapper2 W2; |
84 | } |
85 | @end |
86 | |