134 lines
5.9 KiB
C
134 lines
5.9 KiB
C
|
__attribute__((objc_root_class))
|
||
|
@interface NSError
|
||
|
@end
|
||
|
|
||
|
__attribute__((objc_root_class))
|
||
|
@interface A
|
||
|
@end
|
||
|
|
||
|
struct X { };
|
||
|
|
||
|
void f1(int *x); // expected-warning{{pointer is missing a nullability type specifier}}
|
||
|
// expected-note@-1{{insert '_Nullable' if the pointer may be null}}
|
||
|
// expected-note@-2{{insert '_Nonnull' if the pointer should never be null}}
|
||
|
|
||
|
typedef struct __attribute__((objc_bridge(NSError))) __CFError *CFErrorRef;
|
||
|
typedef NSError *NSErrorPtr;
|
||
|
typedef NSError **NSErrorPtrPtr;
|
||
|
typedef CFErrorRef *CFErrorRefPtr;
|
||
|
typedef int *int_ptr;
|
||
|
typedef A *A_ptr;
|
||
|
typedef int (^block_ptr)(int, int);
|
||
|
|
||
|
#pragma clang assume_nonnull begin
|
||
|
|
||
|
void f2(int *x);
|
||
|
void f3(A* obj);
|
||
|
void f4(int (^block)(int, int));
|
||
|
void f5(int_ptr x);
|
||
|
void f6(A_ptr obj);
|
||
|
void f7(int * _Nullable x);
|
||
|
void f8(A * _Nullable obj);
|
||
|
void f9(int X::* mem_ptr);
|
||
|
void f10(int (X::*mem_func)(int, int));
|
||
|
void f11(int X::* _Nullable mem_ptr);
|
||
|
void f12(int (X::* _Nullable mem_func)(int, int));
|
||
|
|
||
|
int_ptr f13(void);
|
||
|
A *f14(void);
|
||
|
|
||
|
int * _Null_unspecified f15(void);
|
||
|
A * _Null_unspecified f16(void);
|
||
|
void f17(CFErrorRef *error); // expected-note{{no known conversion from 'A * _Nonnull' to 'CFErrorRef _Nullable * _Nullable' (aka '__CFError **') for 1st argument}}
|
||
|
void f18(A **); // expected-warning 2{{pointer is missing a nullability type specifier}}
|
||
|
// expected-note@-1 2 {{insert '_Nullable' if the pointer may be null}}
|
||
|
// expected-note@-2 2 {{insert '_Nonnull' if the pointer should never be null}}
|
||
|
void f19(CFErrorRefPtr error); // expected-warning{{pointer is missing a nullability type specifier}}
|
||
|
// expected-note@-1{{insert '_Nullable' if the pointer may be null}}
|
||
|
// expected-note@-2{{insert '_Nonnull' if the pointer should never be null}}
|
||
|
|
||
|
void g1(int (^)(int, int));
|
||
|
void g2(int (^ *bp)(int, int)); // expected-warning{{block pointer is missing a nullability type specifier}}
|
||
|
// expected-note@-1{{insert '_Nullable' if the block pointer may be null}}
|
||
|
// expected-note@-2{{insert '_Nonnull' if the block pointer should never be null}}
|
||
|
// expected-warning@-3{{pointer is missing a nullability type specifier}}
|
||
|
// expected-note@-4{{insert '_Nullable' if the pointer may be null}}
|
||
|
// expected-note@-5{{insert '_Nonnull' if the pointer should never be null}}
|
||
|
void g3(block_ptr *bp); // expected-warning{{block pointer is missing a nullability type specifier}}
|
||
|
// expected-note@-1{{insert '_Nullable' if the block pointer may be null}}
|
||
|
// expected-note@-2{{insert '_Nonnull' if the block pointer should never be null}}
|
||
|
// expected-warning@-3{{pointer is missing a nullability type specifier}}
|
||
|
// expected-note@-4{{insert '_Nullable' if the pointer may be null}}
|
||
|
// expected-note@-5{{insert '_Nonnull' if the pointer should never be null}}
|
||
|
void g4(int (*fp)(int, int));
|
||
|
void g5(int (**fp)(int, int)); // expected-warning 2{{pointer is missing a nullability type specifier}}
|
||
|
// expected-note@-1 2 {{insert '_Nullable' if the pointer may be null}}
|
||
|
// expected-note@-2 2 {{insert '_Nonnull' if the pointer should never be null}}
|
||
|
|
||
|
@interface A(Pragmas1)
|
||
|
+ (instancetype)aWithA:(A *)a;
|
||
|
- (A *)method1:(A_ptr)ptr;
|
||
|
- (null_unspecified A *)method2;
|
||
|
- (void)method3:(NSError **)error; // expected-note{{passing argument to parameter 'error' here}}
|
||
|
- (void)method4:(NSErrorPtr *)error; // expected-note{{passing argument to parameter 'error' here}}
|
||
|
- (void)method5:(NSErrorPtrPtr)error;
|
||
|
// expected-warning@-1{{pointer is missing a nullability type specifier}}
|
||
|
// expected-note@-2{{insert '_Nullable' if the pointer may be null}}
|
||
|
// expected-note@-3{{insert '_Nonnull' if the pointer should never be null}}
|
||
|
|
||
|
@property A *aProp;
|
||
|
@property NSError **anError; // expected-warning 2{{pointer is missing a nullability type specifier}}
|
||
|
// expected-note@-1 2 {{insert '_Nullable' if the pointer may be null}}
|
||
|
// expected-note@-2 2 {{insert '_Nonnull' if the pointer should never be null}}
|
||
|
@end
|
||
|
|
||
|
int *global_int_ptr;
|
||
|
|
||
|
// typedefs not inferred _Nonnull
|
||
|
typedef int *int_ptr_2;
|
||
|
|
||
|
typedef int * // expected-warning{{pointer is missing a nullability type specifier}}
|
||
|
// expected-note@-1{{insert '_Nullable' if the pointer may be null}}
|
||
|
// expected-note@-2{{insert '_Nonnull' if the pointer should never be null}}
|
||
|
*int_ptr_ptr;
|
||
|
|
||
|
static inline void f30(void) {
|
||
|
float *fp = global_int_ptr; // expected-error{{cannot initialize a variable of type 'float *' with an lvalue of type 'int * _Nonnull'}}
|
||
|
|
||
|
int_ptr_2 ip2;
|
||
|
float *fp2 = ip2; // expected-error{{cannot initialize a variable of type 'float *' with an lvalue of type 'int_ptr_2' (aka 'int *')}}
|
||
|
|
||
|
int_ptr_ptr ipp;
|
||
|
float *fp3 = ipp; // expected-error{{lvalue of type 'int_ptr_ptr' (aka 'int **')}}
|
||
|
}
|
||
|
|
||
|
@interface AA : A {
|
||
|
@public
|
||
|
id ivar1;
|
||
|
_Nonnull id ivar2;
|
||
|
}
|
||
|
@end
|
||
|
|
||
|
#pragma clang assume_nonnull end
|
||
|
|
||
|
void f20(A *a); // expected-warning{{pointer is missing a nullability type specifier}}
|
||
|
// expected-note@-1{{insert '_Nullable' if the pointer may be null}}
|
||
|
// expected-note@-2{{insert '_Nonnull' if the pointer should never be null}}
|
||
|
void f21(int_ptr x); // expected-warning{{pointer is missing a nullability type specifier}}
|
||
|
// expected-note@-1{{insert '_Nullable' if the pointer may be null}}
|
||
|
// expected-note@-2{{insert '_Nonnull' if the pointer should never be null}}
|
||
|
void f22(A_ptr y); // expected-warning{{pointer is missing a nullability type specifier}}
|
||
|
// expected-note@-1{{insert '_Nullable' if the pointer may be null}}
|
||
|
// expected-note@-2{{insert '_Nonnull' if the pointer should never be null}}
|
||
|
void f23(int_ptr _Nullable x);
|
||
|
void f24(A_ptr _Nullable y);
|
||
|
void f25(int_ptr_2 x); // expected-warning{{pointer is missing a nullability type specifier}}
|
||
|
// expected-note@-1{{insert '_Nullable' if the pointer may be null}}
|
||
|
// expected-note@-2{{insert '_Nonnull' if the pointer should never be null}}
|
||
|
|
||
|
@interface A(OutsidePragmas1)
|
||
|
+ (instancetype)aWithInt:(int)value; // expected-warning{{pointer is missing a nullability type specifier}}
|
||
|
// expected-note@-1{{insert '_Nullable' if the pointer may be null}}
|
||
|
// expected-note@-2{{insert '_Nonnull' if the pointer should never be null}}
|
||
|
@end
|