149d29ed950f9e309a7b755b2a0601ed483ce3adePeter Collingbourne// RUN: %clangxx -fsanitize=null %s -O3 -o %t
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %run %t l 2>&1 | FileCheck %s --check-prefix=CHECK-LOAD
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %run %t s 2>&1 | FileCheck %s --check-prefix=CHECK-STORE
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %run %t r 2>&1 | FileCheck %s --check-prefix=CHECK-REFERENCE
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %run %t m 2>&1 | FileCheck %s --check-prefix=CHECK-MEMBER
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %run %t f 2>&1 | FileCheck %s --check-prefix=CHECK-MEMFUN
76ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
86ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithstruct S {
96ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  int f() { return 0; }
106ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  int k;
116ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith};
126ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
136ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smithint main(int, char **argv) {
146ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  int *p = 0;
156ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  S *s = 0;
166ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
176ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  (void)*p; // ok!
186ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith
196ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  switch (argv[1][0]) {
206ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  case 'l':
217cbd7e502e993320a3a1578179d336c268b80604Will Dietz    // CHECK-LOAD: null.cpp:22:12: runtime error: load of null pointer of type 'int'
226ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith    return *p;
236ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  case 's':
247cbd7e502e993320a3a1578179d336c268b80604Will Dietz    // CHECK-STORE: null.cpp:25:5: runtime error: store to null pointer of type 'int'
256ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith    *p = 1;
266ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith    break;
276ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  case 'r':
287cbd7e502e993320a3a1578179d336c268b80604Will Dietz    // CHECK-REFERENCE: null.cpp:29:15: runtime error: reference binding to null pointer of type 'int'
296ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith    {int &r = *p;}
306ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith    break;
316ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  case 'm':
327cbd7e502e993320a3a1578179d336c268b80604Will Dietz    // CHECK-MEMBER: null.cpp:33:15: runtime error: member access within null pointer of type 'S'
336ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith    return s->k;
346ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  case 'f':
357cbd7e502e993320a3a1578179d336c268b80604Will Dietz    // CHECK-MEMFUN: null.cpp:36:12: runtime error: member call on null pointer of type 'S'
366ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith    return s->f();
376ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith  }
386ebe45146a2d93eb010b9bb5ea34cb94c6900f83Richard Smith}
39