1// RUN: %clang_cc1 -analyze -analyzer-checker=core -w -verify %s 2 3@interface MyObject 4- (void)takePointer:(void *)ptr __attribute__((nonnull(1))); 5- (void)takePointerArg:(void *)__attribute__((nonnull)) ptr; 6 7@end 8 9void testNonNullMethod(int *p, MyObject *obj) { 10 if (p) 11 return; 12 [obj takePointer:p]; // expected-warning{{nonnull}} 13} 14 15 16@interface Subclass : MyObject 17// [[nonnull]] is an inherited attribute. 18- (void)takePointer:(void *)ptr; 19@end 20 21void testSubclass(int *p, Subclass *obj) { 22 if (p) 23 return; 24 [obj takePointer:p]; // expected-warning{{nonnull}} 25} 26 27void testSubclassArg(int *p, Subclass *obj) { 28 if (p) 29 return; 30 [obj takePointerArg:p]; // expected-warning{{nonnull}} 31} 32 33 34union rdar16153464_const_cp_t { 35 const struct rdar16153464_cczp *zp; 36 const struct rdar16153464_cczp_prime *prime; 37} __attribute__((transparent_union)); 38 39struct rdar16153464_header { 40 union rdar16153464_const_cp_t cp; 41 unsigned char pad[16 - sizeof(union rdar16153464_const_cp_t *)]; 42} __attribute__((aligned(16))); 43 44 45struct rdar16153464_full_ctx { 46 struct rdar16153464_header hdr; 47} __attribute__((aligned(16))); 48 49 50struct rdar16153464_pub_ctx { 51 struct rdar16153464_header hdr; 52} __attribute__((aligned(16))); 53 54 55union rdar16153464_full_ctx_t { 56 struct rdar16153464_full_ctx *_full; 57 struct rdar16153464_header *hdr; 58 struct rdar16153464_body *body; 59 struct rdar16153464_public *pub; 60} __attribute__((transparent_union)); 61 62union rdar16153464_pub_ctx_t { 63 struct rdar16153464_pub_ctx *_pub; 64 struct rdar16153464_full_ctx *_full; 65 struct rdar16153464_header *hdr; 66 struct rdar16153464_body *body; 67 struct rdar16153464_public *pub; 68 union rdar16153464_full_ctx_t innert; 69} __attribute__((transparent_union)); 70 71int rdar16153464(union rdar16153464_full_ctx_t inner) 72{ 73 extern void rdar16153464_check(union rdar16153464_pub_ctx_t outer) __attribute((nonnull(1))); 74 rdar16153464_check((union rdar16153464_pub_ctx_t){ .innert = inner }); // no-warning 75 rdar16153464_check(inner); // no-warning 76 rdar16153464_check(0); // expected-warning{{nonnull}} 77} 78