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