1 | // RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-arc -fblocks -verify -Wno-objc-root-class %s |
2 | // rdar://9535237 |
3 | |
4 | typedef struct dispatch_queue_s *dispatch_queue_t; |
5 | |
6 | typedef void (^dispatch_block_t)(void); |
7 | |
8 | void dispatch_async(dispatch_queue_t queue, dispatch_block_t block); |
9 | |
10 | extern __attribute__((visibility("default"))) struct dispatch_queue_s _dispatch_main_q; |
11 | |
12 | @interface SwitchBlockCrashAppDelegate |
13 | - (void)pageLeft; |
14 | - (void)pageRight;; |
15 | @end |
16 | |
17 | @implementation SwitchBlockCrashAppDelegate |
18 | |
19 | - (void)choose:(int)button { |
20 | switch (button) { |
21 | case 0: |
22 | dispatch_async((&_dispatch_main_q), ^{ [self pageLeft]; }); // expected-note 3 {{jump enters lifetime of block which strongly captures a variable}} |
23 | break; |
24 | case 2: // expected-error {{cannot jump}} |
25 | dispatch_async((&_dispatch_main_q), ^{ [self pageRight]; }); // expected-note 2 {{jump enters lifetime of block which strongly captures a variable}} |
26 | break; |
27 | case 3: // expected-error {{cannot jump}} |
28 | { |
29 | dispatch_async((&_dispatch_main_q), ^{ [self pageRight]; }); |
30 | break; |
31 | } |
32 | case 4: // expected-error {{cannot jump}} |
33 | break; |
34 | } |
35 | |
36 | __block SwitchBlockCrashAppDelegate *captured_block_obj; |
37 | switch (button) { |
38 | case 10: |
39 | { |
40 | dispatch_async((&_dispatch_main_q), ^{ [self pageLeft]; }); |
41 | break; |
42 | } |
43 | case 12: |
44 | if (button) |
45 | dispatch_async((&_dispatch_main_q), ^{ [captured_block_obj pageRight]; }); |
46 | break; |
47 | case 13: |
48 | while (button) |
49 | dispatch_async((&_dispatch_main_q), ^{ [self pageRight]; }); |
50 | break; |
51 | case 14: |
52 | break; |
53 | } |
54 | |
55 | switch (button) { |
56 | case 10: |
57 | { |
58 | dispatch_async((&_dispatch_main_q), ^{ [self pageLeft]; }); |
59 | break; |
60 | } |
61 | case 12: |
62 | if (button) |
63 | dispatch_async((&_dispatch_main_q), ^{ [self pageRight]; }); |
64 | switch (button) { |
65 | case 0: |
66 | { |
67 | dispatch_async((&_dispatch_main_q), ^{ [self pageLeft]; }); |
68 | break; |
69 | } |
70 | case 4: |
71 | break; |
72 | } |
73 | break; |
74 | case 13: |
75 | while (button) |
76 | dispatch_async((&_dispatch_main_q), ^{ [self pageRight]; }); |
77 | break; |
78 | case 14: |
79 | break; |
80 | } |
81 | } |
82 | - (void)pageLeft {} |
83 | - (void)pageRight {} |
84 | @end |
85 | |
86 | // Test 2. rdar://problem/11150919 |
87 | int test2(id obj, int state) { // expected-note {{jump enters lifetime of block}} FIXME: weird location |
88 | switch (state) { |
89 | case 0: |
90 | (void) ^{ (void) obj; }; |
91 | return 0; |
92 | |
93 | default: // expected-error {{cannot jump}} |
94 | return 1; |
95 | } |
96 | } |
97 | |
98 | |