blob: 3de87fbdcb8b52ac0c6d5ba862f8bdcaa60a6372 [file] [log] [blame]
Jordan Rosee359d012014-02-26 01:20:19 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core -w -verify %s
Jordan Rose682b3162012-07-02 19:28:21 +00002
3@interface MyObject
4- (void)takePointer:(void *)ptr __attribute__((nonnull(1)));
Ted Kremenekf0ae7d02014-01-17 07:15:35 +00005- (void)takePointerArg:(void *)__attribute__((nonnull)) ptr;
6
Jordan Rose682b3162012-07-02 19:28:21 +00007@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}
Ted Kremenekf0ae7d02014-01-17 07:15:35 +000026
27void testSubclassArg(int *p, Subclass *obj) {
28 if (p)
29 return;
30 [obj takePointerArg:p]; // expected-warning{{nonnull}}
31}
32
Jordan Rosee359d012014-02-26 01:20:19 +000033
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}
Richard Smith92572152014-08-27 19:05:47 +000078
79void testVararg(int k, void *p) {
80 extern void testVararg_check(int, ...) __attribute__((nonnull));
81 void *n = 0;
82 testVararg_check(0);
83 testVararg_check(1, p);
84 if (k == 1)
85 testVararg_check(1, n); // expected-warning{{nonnull}}
86 testVararg_check(2, p, p);
87 if (k == 2)
88 testVararg_check(2, n, p); // expected-warning{{nonnull}}
89 if (k == 3)
90 testVararg_check(2, p, n); // expected-warning{{nonnull}}
91}
92
93void testNotPtr() {
94 struct S { int a; int b; int c; } s = {};
95 extern void testNotPtr_check(struct S, int) __attribute__((nonnull(1, 2)));
96 testNotPtr_check(s, 0);
97}