1*89a1d03eSRichard// RUN: %check_clang_tidy %s objc-super-self %t 2*89a1d03eSRichard 3*89a1d03eSRichard@interface NSObject 4*89a1d03eSRichard- (instancetype)init; 5*89a1d03eSRichard- (instancetype)self; 6*89a1d03eSRichard@end 7*89a1d03eSRichard 8*89a1d03eSRichard@interface NSObjectDerivedClass : NSObject 9*89a1d03eSRichard@end 10*89a1d03eSRichard 11*89a1d03eSRichard@implementation NSObjectDerivedClass 12*89a1d03eSRichard 13*89a1d03eSRichard- (instancetype)init { 14*89a1d03eSRichard return [super self]; 15*89a1d03eSRichard// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious invocation of 'self' in initializer; did you mean to invoke a superclass initializer? [objc-super-self] 16*89a1d03eSRichard// CHECK-FIXES: return [super init]; 17*89a1d03eSRichard} 18*89a1d03eSRichard 19*89a1d03eSRichard- (instancetype)initWithObject:(NSObject *)obj { 20*89a1d03eSRichard self = [super self]; 21*89a1d03eSRichard// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious invocation of 'self' in initializer; did you mean to invoke a superclass initializer? [objc-super-self] 22*89a1d03eSRichard// CHECK-FIXES: self = [super init]; 23*89a1d03eSRichard if (self) { 24*89a1d03eSRichard // ... 25*89a1d03eSRichard } 26*89a1d03eSRichard return self; 27*89a1d03eSRichard} 28*89a1d03eSRichard 29*89a1d03eSRichard#define INITIALIZE() [super self] 30*89a1d03eSRichard 31*89a1d03eSRichard- (instancetype)initWithObject:(NSObject *)objc a:(int)a { 32*89a1d03eSRichard return INITIALIZE(); 33*89a1d03eSRichard// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious invocation of 'self' in initializer; did you mean to invoke a superclass initializer? [objc-super-self] 34*89a1d03eSRichard// CHECK-FIXES: return INITIALIZE(); 35*89a1d03eSRichard} 36*89a1d03eSRichard 37*89a1d03eSRichard#define INITIALIZER_IMPL() return [super self] 38*89a1d03eSRichard 39*89a1d03eSRichard- (instancetype)initWithObject:(NSObject *)objc b:(int)b { 40*89a1d03eSRichard INITIALIZER_IMPL(); 41*89a1d03eSRichard// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: suspicious invocation of 'self' in initializer; did you mean to invoke a superclass initializer? [objc-super-self] 42*89a1d03eSRichard// CHECK-FIXES: INITIALIZER_IMPL(); 43*89a1d03eSRichard} 44*89a1d03eSRichard 45*89a1d03eSRichard#define INITIALIZER_METHOD self 46*89a1d03eSRichard 47*89a1d03eSRichard- (instancetype)initWithObject:(NSObject *)objc c:(int)c { 48*89a1d03eSRichard return [super INITIALIZER_METHOD]; 49*89a1d03eSRichard// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious invocation of 'self' in initializer; did you mean to invoke a superclass initializer? [objc-super-self] 50*89a1d03eSRichard// CHECK-FIXES: return [super INITIALIZER_METHOD]; 51*89a1d03eSRichard} 52*89a1d03eSRichard 53*89a1d03eSRichard#define RECEIVER super 54*89a1d03eSRichard 55*89a1d03eSRichard- (instancetype)initWithObject:(NSObject *)objc d:(int)d { 56*89a1d03eSRichard return [RECEIVER self]; 57*89a1d03eSRichard// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: suspicious invocation of 'self' in initializer; did you mean to invoke a superclass initializer? [objc-super-self] 58*89a1d03eSRichard// CHECK-FIXES: return [RECEIVER self]; 59*89a1d03eSRichard} 60*89a1d03eSRichard 61*89a1d03eSRichard- (instancetype)foo { 62*89a1d03eSRichard return [super self]; 63*89a1d03eSRichard} 64*89a1d03eSRichard 65*89a1d03eSRichard- (instancetype)bar { 66*89a1d03eSRichard return [self self]; 67*89a1d03eSRichard} 68*89a1d03eSRichard 69*89a1d03eSRichard@end 70*89a1d03eSRichard 71*89a1d03eSRichard@interface RootClass 72*89a1d03eSRichard- (instancetype)init; 73*89a1d03eSRichard- (instancetype)self; 74*89a1d03eSRichard@end 75*89a1d03eSRichard 76*89a1d03eSRichard@interface NotNSObjectDerivedClass : RootClass 77*89a1d03eSRichard@end 78*89a1d03eSRichard 79*89a1d03eSRichard@implementation NotNSObjectDerivedClass 80*89a1d03eSRichard 81*89a1d03eSRichard- (instancetype)init { 82*89a1d03eSRichard return [super self]; 83*89a1d03eSRichard} 84*89a1d03eSRichard 85*89a1d03eSRichard@end 86*89a1d03eSRichard 87