| // RUN: %clang_cc1 -analyze -analyzer-checker=core -w -verify %s |
| |
| @interface MyObject |
| - (void)takePointer:(void *)ptr __attribute__((nonnull(1))); |
| - (void)takePointerArg:(void *)__attribute__((nonnull)) ptr; |
| |
| @end |
| |
| void testNonNullMethod(int *p, MyObject *obj) { |
| if (p) |
| return; |
| [obj takePointer:p]; // expected-warning{{nonnull}} |
| } |
| |
| |
| @interface Subclass : MyObject |
| // [[nonnull]] is an inherited attribute. |
| - (void)takePointer:(void *)ptr; |
| @end |
| |
| void testSubclass(int *p, Subclass *obj) { |
| if (p) |
| return; |
| [obj takePointer:p]; // expected-warning{{nonnull}} |
| } |
| |
| void testSubclassArg(int *p, Subclass *obj) { |
| if (p) |
| return; |
| [obj takePointerArg:p]; // expected-warning{{nonnull}} |
| } |
| |
| |
| union rdar16153464_const_cp_t { |
| const struct rdar16153464_cczp *zp; |
| const struct rdar16153464_cczp_prime *prime; |
| } __attribute__((transparent_union)); |
| |
| struct rdar16153464_header { |
| union rdar16153464_const_cp_t cp; |
| unsigned char pad[16 - sizeof(union rdar16153464_const_cp_t *)]; |
| } __attribute__((aligned(16))); |
| |
| |
| struct rdar16153464_full_ctx { |
| struct rdar16153464_header hdr; |
| } __attribute__((aligned(16))); |
| |
| |
| struct rdar16153464_pub_ctx { |
| struct rdar16153464_header hdr; |
| } __attribute__((aligned(16))); |
| |
| |
| union rdar16153464_full_ctx_t { |
| struct rdar16153464_full_ctx *_full; |
| struct rdar16153464_header *hdr; |
| struct rdar16153464_body *body; |
| struct rdar16153464_public *pub; |
| } __attribute__((transparent_union)); |
| |
| union rdar16153464_pub_ctx_t { |
| struct rdar16153464_pub_ctx *_pub; |
| struct rdar16153464_full_ctx *_full; |
| struct rdar16153464_header *hdr; |
| struct rdar16153464_body *body; |
| struct rdar16153464_public *pub; |
| union rdar16153464_full_ctx_t innert; |
| } __attribute__((transparent_union)); |
| |
| int rdar16153464(union rdar16153464_full_ctx_t inner) |
| { |
| extern void rdar16153464_check(union rdar16153464_pub_ctx_t outer) __attribute((nonnull(1))); |
| rdar16153464_check((union rdar16153464_pub_ctx_t){ .innert = inner }); // no-warning |
| rdar16153464_check(inner); // no-warning |
| rdar16153464_check(0); // expected-warning{{nonnull}} |
| } |