| // RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -fobjc-arc -fblocks -verify -Wno-objc-root-class %s |
| // rdar://9535237 |
| |
| typedef struct dispatch_queue_s *dispatch_queue_t; |
| |
| typedef void (^dispatch_block_t)(void); |
| |
| void dispatch_async(dispatch_queue_t queue, dispatch_block_t block); |
| |
| extern __attribute__((visibility("default"))) struct dispatch_queue_s _dispatch_main_q; |
| |
| @interface SwitchBlockCrashAppDelegate |
| - (void)pageLeft; |
| - (void)pageRight;; |
| @end |
| |
| @implementation SwitchBlockCrashAppDelegate |
| |
| - (void)choose:(int)button { |
| switch (button) { |
| case 0: |
| dispatch_async((&_dispatch_main_q), ^{ [self pageLeft]; }); // expected-note 3 {{jump enters lifetime of block which strongly captures a variable}} |
| break; |
| case 2: // expected-error {{cannot jump}} |
| dispatch_async((&_dispatch_main_q), ^{ [self pageRight]; }); // expected-note 2 {{jump enters lifetime of block which strongly captures a variable}} |
| break; |
| case 3: // expected-error {{cannot jump}} |
| { |
| dispatch_async((&_dispatch_main_q), ^{ [self pageRight]; }); |
| break; |
| } |
| case 4: // expected-error {{cannot jump}} |
| break; |
| } |
| |
| __block SwitchBlockCrashAppDelegate *captured_block_obj; |
| switch (button) { |
| case 10: |
| { |
| dispatch_async((&_dispatch_main_q), ^{ [self pageLeft]; }); |
| break; |
| } |
| case 12: |
| if (button) |
| dispatch_async((&_dispatch_main_q), ^{ [captured_block_obj pageRight]; }); |
| break; |
| case 13: |
| while (button) |
| dispatch_async((&_dispatch_main_q), ^{ [self pageRight]; }); |
| break; |
| case 14: |
| break; |
| } |
| |
| switch (button) { |
| case 10: |
| { |
| dispatch_async((&_dispatch_main_q), ^{ [self pageLeft]; }); |
| break; |
| } |
| case 12: |
| if (button) |
| dispatch_async((&_dispatch_main_q), ^{ [self pageRight]; }); |
| switch (button) { |
| case 0: |
| { |
| dispatch_async((&_dispatch_main_q), ^{ [self pageLeft]; }); |
| break; |
| } |
| case 4: |
| break; |
| } |
| break; |
| case 13: |
| while (button) |
| dispatch_async((&_dispatch_main_q), ^{ [self pageRight]; }); |
| break; |
| case 14: |
| break; |
| } |
| } |
| - (void)pageLeft {} |
| - (void)pageRight {} |
| @end |
| |
| // Test 2. rdar://problem/11150919 |
| int test2(id obj, int state) { // expected-note {{jump enters lifetime of block}} FIXME: weird location |
| switch (state) { |
| case 0: |
| (void) ^{ (void) obj; }; |
| return 0; |
| |
| default: // expected-error {{cannot jump}} |
| return 1; |
| } |
| } |
| |