Home | History | Annotate | Download | only in SemaObjC
      1 #include "nonnull.h"
      2 
      3 // RUN: %clang_cc1 -fblocks -fsyntax-only -verify %s
      4 
      5 @class NSObject;
      6 
      7 NONNULL_ATTR
      8 int f1(int x); //  no warning
      9 int f2(int *x) __attribute__ ((nonnull (1)));
     10 int f3(int *x) __attribute__ ((nonnull (0))); // expected-error {{'nonnull' attribute parameter 1 is out of bounds}}
     11 int f4(int *x, int *y) __attribute__ ((nonnull (1,2)));
     12 int f5(int *x, int *y) __attribute__ ((nonnull (2,1)));
     13 int f6(NSObject *x) __attribute__ ((nonnull (1))); // no-warning
     14 int f7(NSObject *x) __attribute__ ((nonnull)); // no-warning
     15 
     16 
     17 extern void func1 (void (^block1)(), void (^block2)(), int) __attribute__((nonnull));
     18 
     19 extern void func3 (void (^block1)(), int, void (^block2)(), int)
     20 __attribute__((nonnull(1,3)));
     21 
     22 extern void func4 (void (^block1)(), void (^block2)()) __attribute__((nonnull(1)))
     23 __attribute__((nonnull(2)));
     24 
     25 void func6();
     26 void func7();
     27 
     28 void
     29 foo (int i1, int i2, int i3, void (^cp1)(), void (^cp2)(), void (^cp3)())
     30 {
     31   func1(cp1, cp2, i1);
     32   
     33   func1(0, cp2, i1);  // expected-warning {{null passed to a callee which requires a non-null argument}}
     34   func1(cp1, 0, i1);  // expected-warning {{null passed to a callee which requires a non-null argument}}
     35   func1(cp1, cp2, 0);
     36   
     37   
     38   func3(0, i2, cp3, i3); // expected-warning {{null passed to a callee which requires a non-null argument}}
     39   func3(cp3, i2, 0, i3);  // expected-warning {{null passed to a callee which requires a non-null argument}}
     40   
     41   func4(0, cp1); // expected-warning {{null passed to a callee which requires a non-null argument}}
     42   func4(cp1, 0); // expected-warning {{null passed to a callee which requires a non-null argument}}
     43   
     44   // Shouldn't these emit warnings?  Clang doesn't, and neither does GCC.  It
     45   // seems that the checking should handle Objective-C pointers.
     46   func6((NSObject*) 0); // no-warning
     47   func7((NSObject*) 0); // no-warning
     48 }
     49 
     50 void func5(int) NONNULL_ATTR; //  no warning
     51 
     52 // rdar://6857843
     53 struct dispatch_object_s {
     54     int x;
     55 };
     56 
     57 typedef union {
     58     long first;
     59     struct dispatch_object_s *_do;
     60 } dispatch_object_t __attribute__((transparent_union));
     61 
     62 __attribute__((nonnull))
     63 void _dispatch_queue_push_list(dispatch_object_t _head); // no warning
     64 
     65 void func6(dispatch_object_t _head) {
     66   _dispatch_queue_push_list(0); // expected-warning {{null passed to a callee which requires a non-null argument}}
     67   _dispatch_queue_push_list(_head._do);  // no warning
     68 }
     69 
     70 // rdar://9287695
     71 #define NULL (void*)0
     72 
     73 @interface NSObject 
     74 - (void)doSomethingWithNonNullPointer:(void *)ptr :(int)iarg : (void*)ptr1 __attribute__((nonnull(1, 3)));
     75 + (void)doSomethingClassyWithNonNullPointer:(void *)ptr __attribute__((nonnull(1)));
     76 @end
     77 
     78 extern void DoSomethingNotNull(void *db) __attribute__((nonnull(1)));
     79 
     80 @interface IMP 
     81 {
     82   void * vp;
     83 }
     84 @end
     85 
     86 @implementation IMP
     87 - (void) Meth {
     88   NSObject *object;
     89   [object doSomethingWithNonNullPointer:NULL:1:NULL]; // expected-warning 2 {{null passed to a callee which requires a non-null argument}}
     90   [object doSomethingWithNonNullPointer:vp:1:NULL]; // expected-warning {{null passed to a callee which requires a non-null argument}}
     91   [NSObject doSomethingClassyWithNonNullPointer:NULL]; // expected-warning {{null passed to a callee which requires a non-null argument}}
     92   DoSomethingNotNull(NULL); // expected-warning {{null passed to a callee which requires a non-null argument}}
     93   [object doSomethingWithNonNullPointer:vp:1:vp];
     94 }
     95 @end
     96 
     97