xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/objc/super-self.m (revision 89a1d03e2b379e325daa5249411e414bbd995b5e)
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