You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

140 lines
2.1 KiB

3 years ago
/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#import <Foundation/Foundation.h>
struct my_struct {
int x;
int y;
};
@interface Uninit : NSObject
@property(nonatomic, assign) int obj_field;
@property(nonatomic, readwrite) struct my_struct s;
@end
@implementation Uninit
- (void)capture_in_closure_ok {
__block BOOL x;
void (^block)() = ^() {
x = true;
};
}
- (BOOL)capture_in_closure_bad_FN {
__block BOOL x;
void (^block)() = ^() {
x = true;
};
return x;
}
- (BOOL)set_in_closure_ok {
__block BOOL x;
void (^block)() = ^() {
x = true;
};
block();
return x;
}
- (BOOL)not_set_in_closure_bad_FN {
__block BOOL x;
void (^block)() = ^() {
};
block();
return x;
}
- (BOOL)use_in_closure_bad_FN {
__block BOOL x;
void (^block)() = ^() {
BOOL y = x;
};
block();
}
- (BOOL)dispatch_sync_closure_ok:(dispatch_queue_t)queue {
__block BOOL x;
dispatch_sync(queue, ^() {
x = true;
});
return x;
}
- (BOOL)dispatch_sync_variable_closure_ok:(dispatch_queue_t)queue {
__block BOOL x;
void (^block)() = ^() {
x = true;
};
dispatch_sync(queue, block);
return x;
}
- (struct my_struct)return_my_struct {
struct my_struct s;
s.x = 1;
s.y = 2;
return s;
}
+ (int)call_return_my_struct_ok {
Uninit* o = nil;
return [o return_my_struct].x;
}
dispatch_queue_t queue;
- (void)dispatch_sync_block:(dispatch_block_t)block {
dispatch_sync(queue, ^{
block();
});
}
- (int)init_x_in_block_ok {
__block int x;
[self dispatch_sync_block:^{
x = self->_obj_field;
}];
return x;
}
+ (int)getter_c_struct:(Uninit*)obj {
struct my_struct s = obj.s; // getter is called
return s.x;
}
- (int)call_getter_c_struct_ok {
Uninit* obj = [Uninit new];
struct my_struct s;
s.x = 1;
s.y = 2;
obj.s = s; // setter is called
return [Uninit getter_c_struct:obj];
}
+ (void)call_setter_c_struct_bad {
struct my_struct s;
Uninit* obj = [Uninit new];
obj.s = s; // setter is called
}
@end