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