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