1*faabdfcfSRashmi Mudduluru // RUN: %clang_analyze_cc1 -analyzer-checker=core,apiModeling.TrustReturnsNonnull -verify %s
2*faabdfcfSRashmi Mudduluru 
3*faabdfcfSRashmi Mudduluru int *foo() __attribute__((returns_nonnull));
4*faabdfcfSRashmi Mudduluru 
5*faabdfcfSRashmi Mudduluru int *foo_no_attribute();
6*faabdfcfSRashmi Mudduluru 
test_foo()7*faabdfcfSRashmi Mudduluru int test_foo() {
8*faabdfcfSRashmi Mudduluru   int *x = foo();
9*faabdfcfSRashmi Mudduluru   if (x) {}
10*faabdfcfSRashmi Mudduluru   return *x; // no-warning
11*faabdfcfSRashmi Mudduluru }
12*faabdfcfSRashmi Mudduluru 
test_foo_no_attribute()13*faabdfcfSRashmi Mudduluru int test_foo_no_attribute() {
14*faabdfcfSRashmi Mudduluru   int *x = foo_no_attribute();
15*faabdfcfSRashmi Mudduluru   if (x) {}
16*faabdfcfSRashmi Mudduluru   return *x;  // expected-warning{{Dereference of null pointer}}
17*faabdfcfSRashmi Mudduluru }
18*faabdfcfSRashmi Mudduluru 
test(void * (* f)(void))19*faabdfcfSRashmi Mudduluru void test(void *(*f)(void)) {
20*faabdfcfSRashmi Mudduluru   f();  // Shouldn't crash compiler
21*faabdfcfSRashmi Mudduluru }
22