1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core -analyzer-store=region -analyzer-constraints=range -verify -Wno-null-dereference %s
2 
3 typedef typeof(sizeof(int)) size_t;
4 void malloc (size_t);
5 
6 void f1() {
7   int const &i = 3;
8   int b = i;
9 
10   int *p = 0;
11 
12   if (b != 3)
13     *p = 1; // no-warning
14 }
15 
16 char* ptr();
17 char& ref();
18 
19 // These next two tests just shouldn't crash.
20 char t1 () {
21   ref() = 'c';
22   return '0';
23 }
24 
25 // just a sanity test, the same behavior as t1()
26 char 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!
33 char t3 () {
34   char& r = ref();
35   r = 'c'; // no-warning
36   if (r) return r;
37   return *(char*)0; // no-warning
38 }
39 
40 char t4 () {
41   char* p = ptr();
42   *p = 'c'; // no-warning
43   if (*p) return *p;
44   return *(char*)0; // no-warning
45 }
46 
47 char t5 (char& r) {
48   r = 'c'; // no-warning
49   if (r) return r;
50   return *(char*)0; // no-warning
51 }
52 
53 char t6 (char* p) {
54   *p = 'c'; // no-warning
55   if (*p) return *p;
56   return *(char*)0; // no-warning
57 }
58