hasCanonicalType(blockPointerType())
));
- auto ArgCallsSignalM = hasArgument(0, hasDescendant(callExpr(
+ auto ArgCallsSignalM = hasAnyArgument(stmt(hasDescendant(callExpr(
allOf(
callsName("dispatch_semaphore_signal"),
equalsBoundArgDecl(0, SemaphoreBinding)
- ))));
+ )))));
auto HasBlockAndCallsSignalM = allOf(HasBlockArgumentM, ArgCallsSignalM);
@interface MyInterface1 : NSObject
-(void)use_method_warn;
+-(void) pass_block_as_second_param_warn;
-(void)use_objc_callback_warn;
-(void)testNoWarn;
-(void)acceptBlock:(block_t)callback;
+-(void)flag:(int)flag acceptBlock:(block_t)callback;
@end
@implementation MyInterface1
dispatch_semaphore_wait(sema, 100); // expected-warning{{Waiting on a semaphore with Grand Central Dispatch creates useless threads and is subject to priority inversion}}
}
+-(void) pass_block_as_second_param_warn {
+ dispatch_semaphore_t sema = dispatch_semaphore_create(0);
+
+ [self flag:1 acceptBlock:^{
+ dispatch_semaphore_signal(sema);
+ }];
+ dispatch_semaphore_wait(sema, 100); // expected-warning{{Waiting on a semaphore with Grand Central Dispatch creates useless threads and is subject to priority inversion}}
+}
+
-(void)testNoWarn {
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
callback();
}
+-(void)flag:(int)flag acceptBlock:(block_t)callback {
+ callback();
+}
+
-(void)use_objc_callback_warn {
dispatch_semaphore_t sema = dispatch_semaphore_create(0);