| // RUN: %check_clang_tidy %s objc-nsinvocation-argument-lifetime %t |
| |
| __attribute__((objc_root_class)) |
| @interface NSObject |
| @end |
| |
| @interface NSInvocation : NSObject |
| - (void)getArgument:(void *)Arg atIndex:(int)Index; |
| - (void)getReturnValue:(void *)ReturnValue; |
| @end |
| |
| @interface OtherClass : NSObject |
| - (void)getArgument:(void *)Arg atIndex:(int)Index; |
| @end |
| |
| struct Foo { |
| __unsafe_unretained id Field1; |
| id Field2; |
| int IntField; |
| }; |
| |
| void foo(NSInvocation *Invocation) { |
| __unsafe_unretained id Arg2; |
| id Arg3; |
| // CHECK-FIXES: __unsafe_unretained id Arg3; |
| NSObject __strong *Arg4; |
| // CHECK-FIXES: NSObject __unsafe_unretained *Arg4; |
| __weak id Arg5; |
| // CHECK-FIXES: __unsafe_unretained id Arg5; |
| id ReturnValue; |
| // CHECK-FIXES: __unsafe_unretained id ReturnValue; |
| void (^BlockArg1)(); |
| // CHECK-FIXES: __unsafe_unretained void (^BlockArg1)(); |
| __unsafe_unretained void (^BlockArg2)(); |
| int IntVar; |
| struct Foo Bar; |
| |
| [Invocation getArgument:&Arg2 atIndex:2]; |
| [Invocation getArgument:&IntVar atIndex:2]; |
| |
| [Invocation getArgument:&Arg3 atIndex:3]; |
| // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: NSInvocation '-getArgument:atIndex:' should only pass pointers to objects with ownership __unsafe_unretained [objc-nsinvocation-argument-lifetime] |
| |
| [Invocation getArgument:&Arg4 atIndex:4]; |
| // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: NSInvocation '-getArgument:atIndex:' should only pass pointers to objects with ownership __unsafe_unretained [objc-nsinvocation-argument-lifetime] |
| |
| [Invocation getArgument:&Arg5 atIndex:5]; |
| // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: NSInvocation '-getArgument:atIndex:' should only pass pointers to objects with ownership __unsafe_unretained [objc-nsinvocation-argument-lifetime] |
| |
| [Invocation getArgument:&BlockArg1 atIndex:6]; |
| // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: NSInvocation '-getArgument:atIndex:' should only pass pointers to objects with ownership __unsafe_unretained [objc-nsinvocation-argument-lifetime] |
| |
| [Invocation getArgument:&BlockArg2 atIndex:6]; |
| |
| [Invocation getReturnValue:&ReturnValue]; |
| // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: NSInvocation '-getReturnValue:' should only pass pointers to objects with ownership __unsafe_unretained [objc-nsinvocation-argument-lifetime] |
| |
| [Invocation getArgument:(void *)0 atIndex:6]; |
| |
| [Invocation getArgument:&Bar.Field1 atIndex:2]; |
| [Invocation getArgument:&Bar.Field2 atIndex:2]; |
| // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: NSInvocation '-getArgument:atIndex:' should only pass pointers to objects with ownership __unsafe_unretained [objc-nsinvocation-argument-lifetime] |
| [Invocation getArgument:&Bar.IntField atIndex:2]; |
| } |
| |
| void bar(OtherClass *OC) { |
| id Arg; |
| [OC getArgument:&Arg atIndex:2]; |
| } |
| |
| @interface TestClass : NSObject { |
| @public |
| id Argument1; |
| __unsafe_unretained id Argument2; |
| struct Foo Bar; |
| int IntIvar; |
| } |
| @end |
| |
| @implementation TestClass |
| |
| - (void)processInvocation:(NSInvocation *)Invocation { |
| [Invocation getArgument:&Argument1 atIndex:2]; |
| // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: NSInvocation '-getArgument:atIndex:' should only pass pointers to objects with ownership __unsafe_unretained [objc-nsinvocation-argument-lifetime] |
| [Invocation getArgument:&self->Argument1 atIndex:2]; |
| // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: NSInvocation '-getArgument:atIndex:' should only pass pointers to objects with ownership __unsafe_unretained [objc-nsinvocation-argument-lifetime] |
| [Invocation getArgument:&Argument2 atIndex:2]; |
| [Invocation getArgument:&self->Argument2 atIndex:2]; |
| [Invocation getArgument:&self->IntIvar atIndex:2]; |
| |
| [Invocation getReturnValue:&(self->Bar.Field1)]; |
| [Invocation getReturnValue:&(self->Bar.Field2)]; |
| // CHECK-MESSAGES: :[[@LINE-1]]:30: warning: NSInvocation '-getReturnValue:' should only pass pointers to objects with ownership __unsafe_unretained [objc-nsinvocation-argument-lifetime] |
| [Invocation getReturnValue:&(self->Bar.IntField)]; |
| } |
| |
| @end |
| |
| void baz(NSInvocation *Invocation, TestClass *Obj) { |
| [Invocation getArgument:&Obj->Argument1 atIndex:2]; |
| // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: NSInvocation '-getArgument:atIndex:' should only pass pointers to objects with ownership __unsafe_unretained [objc-nsinvocation-argument-lifetime] |
| [Invocation getArgument:&Obj->Argument2 atIndex:2]; |
| } |