diff options
Diffstat (limited to 'test/Analysis/nonnull.m')
-rw-r--r-- | test/Analysis/nonnull.m | 56 |
1 files changed, 55 insertions, 1 deletions
diff --git a/test/Analysis/nonnull.m b/test/Analysis/nonnull.m index c32a7f780ece..0cea80b536d8 100644 --- a/test/Analysis/nonnull.m +++ b/test/Analysis/nonnull.m @@ -1,7 +1,9 @@ -// RUN: %clang_cc1 -analyze -analyzer-checker=core -verify %s +// 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) { @@ -21,3 +23,55 @@ void testSubclass(int *p, Subclass *obj) { 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}} +} |