1*67e74705SXin Li// RUN: %clang_cc1 -analyze -analyzer-checker=core,nullability -verify %s 2*67e74705SXin Li 3*67e74705SXin Li#define nil 0 4*67e74705SXin Li 5*67e74705SXin Li@protocol NSObject 6*67e74705SXin Li+ (id)alloc; 7*67e74705SXin Li- (id)init; 8*67e74705SXin Li- (instancetype)autorelease; 9*67e74705SXin Li- (void)release; 10*67e74705SXin Li@end 11*67e74705SXin Li 12*67e74705SXin Li__attribute__((objc_root_class)) 13*67e74705SXin Li@interface 14*67e74705SXin LiNSObject<NSObject> 15*67e74705SXin Li@end 16*67e74705SXin Li 17*67e74705SXin Li@interface TestObject : NSObject 18*67e74705SXin Li@end 19*67e74705SXin Li 20*67e74705SXin LiTestObject * _Nonnull returnsNilObjCInstanceIndirectly() { 21*67e74705SXin Li TestObject *local = 0; 22*67e74705SXin Li return local; // expected-warning {{Null is returned from a function that is expected to return a non-null value}} 23*67e74705SXin Li} 24*67e74705SXin Li 25*67e74705SXin LiTestObject * _Nonnull returnsNilObjCInstanceIndirectlyWithSupressingCast() { 26*67e74705SXin Li TestObject *local = 0; 27*67e74705SXin Li return (TestObject * _Nonnull)local; // no-warning 28*67e74705SXin Li} 29*67e74705SXin Li 30*67e74705SXin LiTestObject * _Nonnull returnsNilObjCInstanceDirectly() { 31*67e74705SXin Li // The first warning is from Sema. The second is from the static analyzer. 32*67e74705SXin Li return nil; // expected-warning {{null returned from function that requires a non-null return value}} 33*67e74705SXin Li // expected-warning@-1 {{Null is returned from a function that is expected to return a non-null value}} 34*67e74705SXin Li} 35*67e74705SXin Li 36*67e74705SXin LiTestObject * _Nonnull returnsNilObjCInstanceDirectlyWithSuppressingCast() { 37*67e74705SXin Li return (TestObject * _Nonnull)nil; // no-warning 38*67e74705SXin Li} 39*67e74705SXin Li 40*67e74705SXin Livoid testObjCNonARCNoInitialization(TestObject * _Nonnull p) { 41*67e74705SXin Li TestObject * _Nonnull implicitlyZeroInitialized; // no-warning 42*67e74705SXin Li implicitlyZeroInitialized = p; 43*67e74705SXin Li} 44*67e74705SXin Li 45*67e74705SXin Livoid testObjCNonARCExplicitZeroInitialization() { 46*67e74705SXin Li TestObject * _Nonnull explicitlyZeroInitialized = nil; // expected-warning {{Null is assigned to a pointer which is expected to have non-null value}} 47*67e74705SXin Li} 48*67e74705SXin Li 49*67e74705SXin Li@interface ClassWithInitializers : NSObject 50*67e74705SXin Li@end 51*67e74705SXin Li 52*67e74705SXin Li@implementation ClassWithInitializers 53*67e74705SXin Li- (instancetype _Nonnull)initWithNonnullReturnAndSelfCheckingIdiom { 54*67e74705SXin Li // This defensive check is a common-enough idiom that we don't want 55*67e74705SXin Li // to issue a diagnostic for it. 56*67e74705SXin Li if (self = [super init]) { 57*67e74705SXin Li } 58*67e74705SXin Li 59*67e74705SXin Li return self; // no-warning 60*67e74705SXin Li} 61*67e74705SXin Li 62*67e74705SXin Li- (instancetype _Nonnull)initWithNonnullReturnAndNilReturnViaLocal { 63*67e74705SXin Li self = [super init]; 64*67e74705SXin Li // This leaks, but we're not checking for that here. 65*67e74705SXin Li 66*67e74705SXin Li ClassWithInitializers *other = nil; 67*67e74705SXin Li // False negative. Once we have more subtle suppression of defensive checks in 68*67e74705SXin Li // initializers we should warn here. 69*67e74705SXin Li return other; 70*67e74705SXin Li} 71*67e74705SXin Li 72*67e74705SXin Li- (instancetype _Nonnull)initWithPreconditionViolation:(int)p { 73*67e74705SXin Li self = [super init]; 74*67e74705SXin Li if (p < 0) { 75*67e74705SXin Li [self release]; 76*67e74705SXin Li return (ClassWithInitializers * _Nonnull)nil; 77*67e74705SXin Li } 78*67e74705SXin Li return self; 79*67e74705SXin Li} 80*67e74705SXin Li 81*67e74705SXin Li+ (instancetype _Nonnull)factoryCallingInitWithNonnullReturnAndSelfCheckingIdiom { 82*67e74705SXin Li return [[[self alloc] initWithNonnullReturnAndSelfCheckingIdiom] autorelease]; // no-warning 83*67e74705SXin Li} 84*67e74705SXin Li 85*67e74705SXin Li+ (instancetype _Nonnull)factoryCallingInitWithNonnullReturnAndNilReturnViaLocal { 86*67e74705SXin Li return [[[self alloc] initWithNonnullReturnAndNilReturnViaLocal] autorelease]; // no-warning 87*67e74705SXin Li} 88*67e74705SXin Li 89*67e74705SXin Li+ (instancetype _Nonnull)initWithPreconditionViolation:(int) p { 90*67e74705SXin Li return [[[self alloc] initWithPreconditionViolation:p] autorelease]; // no-warning 91*67e74705SXin Li} 92*67e74705SXin Li 93*67e74705SXin Li- (TestObject * _Nonnull) returnsNil { 94*67e74705SXin Li return (TestObject * _Nonnull)nil; 95*67e74705SXin Li} 96*67e74705SXin Li- (TestObject * _Nonnull) inlineOfReturnsNilObjCInstanceDirectlyWithSuppressingCast { 97*67e74705SXin Li TestObject *o = [self returnsNil]; 98*67e74705SXin Li return o; 99*67e74705SXin Li} 100*67e74705SXin Li@end 101