reference.cpp revision 65d39251ff57b8e33cf6d3a7fcc6aa1c6f8cdc68
1// RUN: %clang_cc1 -analyze -analyzer-checker=core.experimental -analyzer-check-objc-mem -analyzer-store=region -analyzer-constraints=range -verify %s
2
3typedef typeof(sizeof(int)) size_t;
4void malloc (size_t);
5
6void f1() {
7  int const &i = 3;  // <--- **FIXME** This is currently not being modeled correctly.
8  int b = i;
9
10  int *p = 0;
11
12  if (b != 3)
13    *p = 1; // no-warning
14}
15
16char* ptr();
17char& ref();
18
19// These next two tests just shouldn't crash.
20char t1 () {
21  ref() = 'c';
22  return '0';
23}
24
25// just a sanity test, the same behavior as t1()
26char t2 () {
27  *ptr() = 'c';
28  return '0';
29}
30
31// Each of the tests below is repeated with pointers as well as references.
32// This is mostly a sanity check, but then again, both should work!
33char t3 () {
34  char& r = ref();
35  r = 'c'; // no-warning
36  if (r) return r;
37  return *(char*)0; // no-warning
38}
39
40char t4 () {
41  char* p = ptr();
42  *p = 'c'; // no-warning
43  if (*p) return *p;
44  return *(char*)0; // no-warning
45}
46
47char t5 (char& r) {
48  r = 'c'; // no-warning
49  if (r) return r;
50  return *(char*)0; // no-warning
51}
52
53char t6 (char* p) {
54  *p = 'c'; // no-warning
55  if (*p) return *p;
56  return *(char*)0; // no-warning
57}
58