| 
  
 test_1 
  | 
     ‘test_1’: events 1-2 
|    83 | void test_1 (const char *str) |  
 |      ^~~~~~ |  
 |      | |  
 |      (1) entry to ‘test_1’ |  
|    84 | { |  
|    85 |   string_obj *obj = new_string_obj (str); |  
 |                     ~~~~~~~~~~~~~~~~~~~~ |  
 |                     | |  
 |                     (2) calling ‘new_string_obj’ from ‘test_1’ |  
 
 |   
   | 
  
 new_string_obj 
  | 
     ‘new_string_obj’: events 3-4 
|    53 | string_obj *new_string_obj (const char *str) |  
 |             ^~~~~~~~~~~~~~ |  
 |             | |  
 |             (3) entry to ‘new_string_obj’ |  
| [...] |  |  
|    59 |     = (string_obj *)alloc_obj (&str_type, sizeof (string_obj) + len + 1); |  
 |                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |  
 |                     | |  
 |                     (4) calling ‘alloc_obj’ from ‘new_string_obj’ |  
 
 |   
   | 
  
 alloc_obj 
  | 
     ‘alloc_obj’: events 5-9 
|    43 | base_obj *alloc_obj (type_obj *ob_type, size_t sz) |  
 |           ^~~~~~~~~ |  
 |           | |  
 |           (5) entry to ‘alloc_obj’ |  
|    44 | { |  
|    45 |   base_obj *obj = (base_obj *)malloc (sz); |  
 |                               ~~~~~~~~~~~ |  
 |                               | |  
 |                               (6) allocated here |  
|    46 |   if (!obj) |  
 |      ~      |  
 |      | |  
 |      (7) assuming ‘obj’ is non-NULL |  
 |      (8) following ‘false’ branch (when ‘obj’ is non-NULL)... |  
|    47 |     return NULL; |  
|    48 |   obj->ob_type = ob_type; |  
 |   ~~~~~~~~~~~~~~~~~~~~~~ |  
 |                | |  
 |                (9) ...to here |  
 
 |   
 |   
  | 
     ‘new_string_obj’: event 10 
|    59 |     = (string_obj *)alloc_obj (&str_type, sizeof (string_obj) + len + 1); |  
 |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |  
 |                     | |  
 |                     (10) returning to ‘new_string_obj’ from ‘alloc_obj’ |  
 
 |   
 |   
  | 
     ‘test_1’: events 11-14 
|    85 |   string_obj *obj = new_string_obj (str); |  
 |                     ^~~~~~~~~~~~~~~~~~~~ |  
 |                     | |  
 |                     (11) returning to ‘test_1’ from ‘new_string_obj’ |  
|    86 |   //__analyzer_dump(); |  
|    87 |   if (obj) |  
 |      ~                |  
 |      | |  
 |      (12) following ‘true’ branch (when ‘obj’ is non-NULL)... |  
|    88 |     unref (obj); |  
 |     ~~~~~~~~~~~       |  
 |     | |  
 |     (13) ...to here |  
 |     (14) calling ‘unref’ from ‘test_1’ |  
 
 |   
   | 
  
 unref 
  | 
     ‘unref’: events 15-17 
|    73 | void unref (string_obj *obj) |  
 |      ^~~~~ |  
 |      | |  
 |      (15) entry to ‘unref’ |  
| [...] |  |  
|    76 |   if (--obj->str_base.ob_refcnt == 0) |  
 |      ~ |  
 |      | |  
 |      (16) following ‘false’ branch... |  
| [...] |  |  
|    81 | } |  
 | ~      |  
 | | |  
 | (17) ...to here |  
 
 |   
 |   
  | 
     ‘test_1’: events 18-19 
|    88 |     unref (obj); |  
 |     ^~~~~~~~~~~ |  
 |     | |  
 |     (18) returning to ‘test_1’ from ‘unref’ |  
|    89 | } /* { dg-bogus "leak" "" { xfail *-*-* } } */ |  
 | ~     |  
 | | |  
 | (19) ‘obj’ leaks here; was allocated at (6) |  
 
 |   
 |