// RUN: %check_clang_tidy %s google-objc-avoid-nsobject-new %t @interface NSObject + (instancetype)new; + (instancetype)alloc; - (instancetype)init; @end @interface NSProxy // Root class with no -init method. @end // NSDate provides a specific factory method. @interface NSDate : NSObject + (instancetype)date; @end // For testing behavior with Objective-C Generics. @interface NSMutableDictionary<__covariant KeyType, __covariant ObjectType> : NSObject @end @class NSString; #define ALLOCATE_OBJECT(_Type) [_Type new] void CheckSpecificInitRecommendations(void) { NSObject *object = [NSObject new]; // CHECK-MESSAGES: [[@LINE-1]]:22: warning: do not create objects with +new [google-objc-avoid-nsobject-new] // CHECK-FIXES: [NSObject alloc] init]; NSDate *correctDate = [NSDate date]; NSDate *incorrectDate = [NSDate new]; // CHECK-MESSAGES: [[@LINE-1]]:27: warning: do not create objects with +new [google-objc-avoid-nsobject-new] // CHECK-FIXES: [NSDate date]; NSObject *macroCreated = ALLOCATE_OBJECT(NSObject); // Shouldn't warn on macros. NSMutableDictionary *dict = [NSMutableDictionary new]; // CHECK-MESSAGES: [[@LINE-1]]:31: warning: do not create objects with +new [google-objc-avoid-nsobject-new] // CHECK-FIXES: [NSMutableDictionary alloc] init]; } @interface Foo : NSObject + (instancetype)new; // Declare again to suppress warning. - (instancetype)initWithInt:(int)anInt; - (instancetype)init __attribute__((unavailable)); - (id)new; @end @interface Baz : Foo // Check unavailable -init through inheritance. @end @interface ProxyFoo : NSProxy + (instancetype)new; @end void CallNewWhenInitUnavailable(void) { Foo *foo = [Foo new]; // CHECK-MESSAGES: [[@LINE-1]]:14: warning: do not create objects with +new [google-objc-avoid-nsobject-new] Baz *baz = [Baz new]; // CHECK-MESSAGES: [[@LINE-1]]:14: warning: do not create objects with +new [google-objc-avoid-nsobject-new] // Instance method -new calls may be weird, but are not strictly forbidden. Foo *bar = [[Foo alloc] initWithInt:4]; [bar new]; ProxyFoo *proxy = [ProxyFoo new]; // CHECK-MESSAGES: [[@LINE-1]]:21: warning: do not create objects with +new [google-objc-avoid-nsobject-new] } @interface HasNewOverride : NSObject @end @implementation HasNewOverride + (instancetype)new { return [[self alloc] init]; } // CHECK-MESSAGES: [[@LINE-3]]:1: warning: classes should not override +new [google-objc-avoid-nsobject-new] @end