aboutsummaryrefslogtreecommitdiff
path: root/test/Analysis/nonnull.m
diff options
context:
space:
mode:
Diffstat (limited to 'test/Analysis/nonnull.m')
-rw-r--r--test/Analysis/nonnull.m56
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}}
+}