xref: /aosp_15_r20/external/clang/test/Analysis/nullability-no-arc.mm (revision 67e74705e28f6214e480b399dd47ea732279e315)
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