// 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}} }