98 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
// 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;
 | 
						|
  }
 | 
						|
}
 | 
						|
 |