1 // RUN: %clang_cc1 -std=c++0x -analyze -analyzer-checker=core -analyzer-store region -verify %s
2 
3 // test to see if nullptr is detected as a null pointer
4 void foo1(void) {
5   char  *np = nullptr;
6   *np = 0;  // expected-warning{{Dereference of null pointer}}
7 }
8 
9 // check if comparing nullptr to nullptr is detected properly
10 void foo2(void) {
11   char *np1 = nullptr;
12   char *np2 = np1;
13   char c;
14   if (np1 == np2)
15     np1 = &c;
16   *np1 = 0;  // no-warning
17 }
18 
19 // invoving a nullptr in a more complex operation should be cause a warning
20 void foo3(void) {
21   struct foo {
22     int a, f;
23   };
24   char *np = nullptr;
25   // casting a nullptr to anything should be caught eventually
26   int *ip = &(((struct foo *)np)->f);
27   *ip = 0;  // expected-warning{{Dereference of null pointer}}
28   // should be error here too, but analysis gets stopped
29 //  *np = 0;
30 }
31 
32 // nullptr is implemented as a zero integer value, so should be able to compare
33 void foo4(void) {
34   char *np = nullptr;
35   if (np != 0)
36     *np = 0;  // no-warning
37   char  *cp = 0;
38   if (np != cp)
39     *np = 0;  // no-warning
40 }
41 
42 
43 int pr10372(void *& x) {
44   // GNU null is a pointer-sized integer, not a pointer.
45   x = __null;
46   // This used to crash.
47   return __null;
48 }
49 
50