Home | History | Annotate | Download | only in SemaObjC
      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 {{switch case is in protected scope}}
     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 {{switch case is in protected scope}}
     28         {
     29           dispatch_async((&_dispatch_main_q), ^{ [self pageRight]; });
     30           break;
     31         }
     32     case 4: // expected-error {{switch case is in protected scope}}
     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 {{switch case is in protected scope}}
     94     return 1;
     95   }
     96 }
     97 
     98