1// RUN: %clang_cc1 -std=c++11 -Wno-conversion-null -analyze -analyzer-checker=core -analyzer-store region -verify %s
2
3// test to see if nullptr is detected as a null pointer
4void 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
10void 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
20void 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
33void 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
42int pr10372(void *& x) {
43  // GNU null is a pointer-sized integer, not a pointer.
44  x = __null;
45  // This used to crash.
46  return __null;
47}
48
49void zoo1() {
50  char **p = 0;
51  delete *(p + 0); // expected-warning{{Dereference of null pointer}}
52}
53
54void zoo2() {
55  int **a = 0;
56  int **b = 0;
57  asm ("nop"
58      :"=r"(*a)
59      :"0"(*b) // expected-warning{{Dereference of null pointer}}
60      );
61}
62
63int exprWithCleanups() {
64  struct S {
65    S(int a):a(a){}
66    ~S() {}
67
68    int a;
69  };
70
71  int *x = 0;
72  return S(*x).a; // expected-warning{{Dereference of null pointer}}
73}
74
75int materializeTempExpr() {
76  int *n = 0;
77  struct S {
78    int a;
79    S(int i): a(i) {}
80  };
81  const S &s = S(*n); // expected-warning{{Dereference of null pointer}}
82  return s.a;
83}
84
85typedef decltype(nullptr) nullptr_t;
86void testMaterializeTemporaryExprWithNullPtr() {
87  // Create MaterializeTemporaryExpr with a nullptr inside.
88  const nullptr_t &r = nullptr;
89}
90