diff options
Diffstat (limited to 'test/Sema/nonnull.c')
-rw-r--r-- | test/Sema/nonnull.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/test/Sema/nonnull.c b/test/Sema/nonnull.c index 4e6171160f64..b1f69208241b 100644 --- a/test/Sema/nonnull.c +++ b/test/Sema/nonnull.c @@ -20,3 +20,37 @@ int main(void) { } void foo(const char *str) __attribute__((nonnull("foo"))); // expected-error{{'nonnull' attribute requires parameter 1 to be an integer constant}} +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}} + +void baz(__attribute__((nonnull)) const char *str); +void baz2(__attribute__((nonnull(1))) const char *str); // expected-warning {{'nonnull' attribute when used on parameters takes no arguments}} +void baz3(__attribute__((nonnull)) int x); // expected-warning {{'nonnull' attribute only applies to pointer arguments}} + +void test_baz() { + baz(0); // expected-warning {{null passed to a callee which requires a non-null argument}} + baz2(0); // no-warning + baz3(0); // no-warning +} + +void test_void_returns_nonnull(void) __attribute__((returns_nonnull)); // expected-warning {{'returns_nonnull' attribute only applies to return values that are pointers}} +int test_int_returns_nonnull(void) __attribute__((returns_nonnull)); // expected-warning {{'returns_nonnull' attribute only applies to return values that are pointers}} +void *test_ptr_returns_nonnull(void) __attribute__((returns_nonnull)); // no-warning + +int i __attribute__((nonnull)); // expected-warning {{'nonnull' attribute only applies to functions, methods, and parameters}} +int j __attribute__((returns_nonnull)); // expected-warning {{'returns_nonnull' attribute only applies to functions and methods}} +void *test_no_fn_proto() __attribute__((returns_nonnull)); // no-warning +void *test_with_fn_proto(void) __attribute__((returns_nonnull)); // no-warning + +__attribute__((returns_nonnull)) +void *test_bad_returns_null(void) { + return 0; // expected-warning {{null returned from function that requires a non-null return value}} +} + +void PR18795(int (*g)(const char *h, ...) __attribute__((nonnull(1))) __attribute__((nonnull))) { + g(0); // expected-warning{{null passed to a callee which requires a non-null argument}} +} +void PR18795_helper() { + PR18795(0); // expected-warning{{null passed to a callee which requires a non-null argument}} +} + + |