Home | History | Annotate | Download | only in Sema
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 // rdar://9584012
      3 
      4 typedef struct {
      5 	char *str;
      6 } Class;
      7 
      8 typedef union {
      9 	Class *object;
     10 } Instance __attribute__((transparent_union));
     11 
     12 __attribute__((nonnull(1))) void Class_init(Instance this, char *str) {
     13 	this.object->str = str;
     14 }
     15 
     16 int main(void) {
     17 	Class *obj;
     18 	Class_init(0, "Hello World"); // expected-warning {{null passed to a callee which requires a non-null argument}}
     19 	Class_init(obj, "Hello World");
     20 }
     21 
     22 void foo(const char *str) __attribute__((nonnull("foo"))); // expected-error{{'nonnull' attribute requires parameter 1 to be an integer constant}}
     23 void bar(int i) __attribute__((nonnull(1))); // expected-warning {{'nonnull' attribute only applies to pointer arguments}} expected-warning {{'nonnull' attribute applied to function with no pointer arguments}}
     24 
     25 void baz(__attribute__((nonnull)) const char *str);
     26 void baz2(__attribute__((nonnull(1))) const char *str); // expected-warning {{'nonnull' attribute when used on parameters takes no arguments}}
     27 void baz3(__attribute__((nonnull)) int x); // expected-warning {{'nonnull' attribute only applies to pointer arguments}}
     28 
     29 void test_baz() {
     30   baz(0); // expected-warning {{null passed to a callee which requires a non-null argument}}
     31   baz2(0); // no-warning
     32   baz3(0); // no-warning
     33 }
     34 
     35 void test_void_returns_nonnull(void) __attribute__((returns_nonnull)); // expected-warning {{'returns_nonnull' attribute only applies to return values that are pointers}}
     36 int test_int_returns_nonnull(void) __attribute__((returns_nonnull)); // expected-warning {{'returns_nonnull' attribute only applies to return values that are pointers}}
     37 void *test_ptr_returns_nonnull(void) __attribute__((returns_nonnull)); // no-warning
     38 
     39 int i __attribute__((nonnull)); // expected-warning {{'nonnull' attribute only applies to functions, methods, and parameters}}
     40 int j __attribute__((returns_nonnull)); // expected-warning {{'returns_nonnull' attribute only applies to functions and methods}}
     41 void *test_no_fn_proto() __attribute__((returns_nonnull));  // expected-warning {{'returns_nonnull' attribute only applies to functions and methods}}
     42 
     43 __attribute__((returns_nonnull))
     44 void *test_bad_returns_null(void) {
     45   return 0; // expected-warning {{null returned from function that requires a non-null return value}}
     46 }
     47 
     48 void PR18795(int (*g)(const char *h, ...) __attribute__((nonnull(1))) __attribute__((nonnull))) {
     49   g(0); // expected-warning{{null passed to a callee which requires a non-null argument}}
     50 }
     51 void PR18795_helper() {
     52   PR18795(0); // expected-warning{{null passed to a callee which requires a non-null argument}}
     53 }
     54 
     55 
     56