1 __attribute__((objc_root_class))
2 @interface NSError
3 @end
4 
5 __attribute__((objc_root_class))
6 @interface A
7 @end
8 
9 struct X { };
10 
11 void f1(int *x); // expected-warning{{pointer is missing a nullability type specifier}}
12 // expected-note@-1{{insert '_Nullable' if the pointer may be null}}
13 // expected-note@-2{{insert '_Nonnull' if the pointer should never be null}}
14 
15 typedef struct __attribute__((objc_bridge(NSError))) __CFError *CFErrorRef;
16 typedef NSError *NSErrorPtr;
17 typedef NSError **NSErrorPtrPtr;
18 typedef CFErrorRef *CFErrorRefPtr;
19 typedef int *int_ptr;
20 typedef A *A_ptr;
21 typedef int (^block_ptr)(int, int);
22 
23 #pragma clang assume_nonnull begin
24 
25 void f2(int *x);
26 void f3(A* obj);
27 void f4(int (^block)(int, int));
28 void f5(int_ptr x);
29 void f6(A_ptr obj);
30 void f7(int * _Nullable x);
31 void f8(A * _Nullable obj);
32 void f9(int X::* mem_ptr);
33 void f10(int (X::*mem_func)(int, int));
34 void f11(int X::* _Nullable mem_ptr);
35 void f12(int (X::* _Nullable mem_func)(int, int));
36 
37 int_ptr f13(void);
38 A *f14(void);
39 
40 int * _Null_unspecified f15(void);
41 A * _Null_unspecified f16(void);
42 void f17(CFErrorRef *error); // expected-note{{no known conversion from 'A * _Nonnull' to 'CFErrorRef  _Nullable * _Nullable' (aka '__CFError **') for 1st argument}}
43 void f18(A **); // expected-warning 2{{pointer is missing a nullability type specifier}}
44 // expected-note@-1 2 {{insert '_Nullable' if the pointer may be null}}
45 // expected-note@-2 2 {{insert '_Nonnull' if the pointer should never be null}}
46 void f19(CFErrorRefPtr error); // expected-warning{{pointer is missing a nullability type specifier}}
47 // expected-note@-1{{insert '_Nullable' if the pointer may be null}}
48 // expected-note@-2{{insert '_Nonnull' if the pointer should never be null}}
49 
50 void g1(int (^)(int, int));
51 void g2(int (^ *bp)(int, int)); // expected-warning{{block pointer is missing a nullability type specifier}}
52 // expected-note@-1{{insert '_Nullable' if the block pointer may be null}}
53 // expected-note@-2{{insert '_Nonnull' if the block pointer should never be null}}
54 // expected-warning@-3{{pointer is missing a nullability type specifier}}
55 // expected-note@-4{{insert '_Nullable' if the pointer may be null}}
56 // expected-note@-5{{insert '_Nonnull' if the pointer should never be null}}
57 void g3(block_ptr *bp); // expected-warning{{block pointer is missing a nullability type specifier}}
58 // expected-note@-1{{insert '_Nullable' if the block pointer may be null}}
59 // expected-note@-2{{insert '_Nonnull' if the block pointer should never be null}}
60 // expected-warning@-3{{pointer is missing a nullability type specifier}}
61 // expected-note@-4{{insert '_Nullable' if the pointer may be null}}
62 // expected-note@-5{{insert '_Nonnull' if the pointer should never be null}}
63 void g4(int (*fp)(int, int));
64 void g5(int (**fp)(int, int)); // expected-warning 2{{pointer is missing a nullability type specifier}}
65 // expected-note@-1 2 {{insert '_Nullable' if the pointer may be null}}
66 // expected-note@-2 2 {{insert '_Nonnull' if the pointer should never be null}}
67 
68 @interface A(Pragmas1)
69 + (instancetype)aWithA:(A *)a;
70 - (A *)method1:(A_ptr)ptr;
71 - (null_unspecified A *)method2;
72 - (void)method3:(NSError **)error; // expected-note{{passing argument to parameter 'error' here}}
73 - (void)method4:(NSErrorPtr *)error; // expected-note{{passing argument to parameter 'error' here}}
74 - (void)method5:(NSErrorPtrPtr)error;
75 // expected-warning@-1{{pointer is missing a nullability type specifier}}
76 // expected-note@-2{{insert '_Nullable' if the pointer may be null}}
77 // expected-note@-3{{insert '_Nonnull' if the pointer should never be null}}
78 
79 @property A *aProp;
80 @property NSError **anError; // expected-warning 2{{pointer is missing a nullability type specifier}}
81 // expected-note@-1 2 {{insert '_Nullable' if the pointer may be null}}
82 // expected-note@-2 2 {{insert '_Nonnull' if the pointer should never be null}}
83 @end
84 
85 int *global_int_ptr;
86 
87 // typedefs not inferred _Nonnull
88 typedef int *int_ptr_2;
89 
90 typedef int * // expected-warning{{pointer is missing a nullability type specifier}}
91 // expected-note@-1{{insert '_Nullable' if the pointer may be null}}
92 // expected-note@-2{{insert '_Nonnull' if the pointer should never be null}}
93             *int_ptr_ptr;
94 
95 static inline void f30(void) {
96   float *fp = global_int_ptr; // expected-error{{cannot initialize a variable of type 'float *' with an lvalue of type 'int * _Nonnull'}}
97 
98   int_ptr_2 ip2;
99   float *fp2 = ip2; // expected-error{{cannot initialize a variable of type 'float *' with an lvalue of type 'int_ptr_2' (aka 'int *')}}
100 
101   int_ptr_ptr ipp;
102   float *fp3 = ipp; // expected-error{{lvalue of type 'int_ptr_ptr' (aka 'int **')}}
103 }
104 
105 @interface AA : A {
106 @public
107   id ivar1;
108   _Nonnull id ivar2;
109 }
110 @end
111 
112 #pragma clang assume_nonnull end
113 
114 void f20(A *a); // expected-warning{{pointer is missing a nullability type specifier}}
115 // expected-note@-1{{insert '_Nullable' if the pointer may be null}}
116 // expected-note@-2{{insert '_Nonnull' if the pointer should never be null}}
117 void f21(int_ptr x); // expected-warning{{pointer is missing a nullability type specifier}}
118 // expected-note@-1{{insert '_Nullable' if the pointer may be null}}
119 // expected-note@-2{{insert '_Nonnull' if the pointer should never be null}}
120 void f22(A_ptr y); // expected-warning{{pointer is missing a nullability type specifier}}
121 // expected-note@-1{{insert '_Nullable' if the pointer may be null}}
122 // expected-note@-2{{insert '_Nonnull' if the pointer should never be null}}
123 void f23(int_ptr _Nullable x);
124 void f24(A_ptr _Nullable y);
125 void f25(int_ptr_2 x); // expected-warning{{pointer is missing a nullability type specifier}}
126 // expected-note@-1{{insert '_Nullable' if the pointer may be null}}
127 // expected-note@-2{{insert '_Nonnull' if the pointer should never be null}}
128 
129 @interface A(OutsidePragmas1)
130 + (instancetype)aWithInt:(int)value; // expected-warning{{pointer is missing a nullability type specifier}}
131 // expected-note@-1{{insert '_Nullable' if the pointer may be null}}
132 // expected-note@-2{{insert '_Nonnull' if the pointer should never be null}}
133 @end
134