| 
  
 test_1 
  | 
     ‘test_1’: events 1-2 
|    99 | void test_1 (const char *str) |  
 |      ^~~~~~ |  
 |      | |  
 |      (1) entry to ‘test_1’ |  
|   100 | { |  
|   101 |   base_obj *obj = new_string_obj (str); |  
 |                   ~~~~~~~~~~~~~~~~~~~~ |  
 |                   | |  
 |                   (2) calling ‘new_string_obj’ from ‘test_1’ |  
 
 |   
   | 
  
 new_string_obj 
  | 
     ‘new_string_obj’: events 3-4 
|    69 | base_obj *new_string_obj (const char *str) |  
 |           ^~~~~~~~~~~~~~ |  
 |           | |  
 |           (3) entry to ‘new_string_obj’ |  
| [...] |  |  
|    75 |     = (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 
|    59 | base_obj *alloc_obj (type_obj *ob_type, size_t sz) |  
 |           ^~~~~~~~~ |  
 |           | |  
 |           (5) entry to ‘alloc_obj’ |  
|    60 | { |  
|    61 |   base_obj *obj = (base_obj *)malloc (sz); |  
 |                               ~~~~~~~~~~~ |  
 |                               | |  
 |                               (6) allocated here |  
|    62 |   if (!obj) |  
 |      ~      |  
 |      | |  
 |      (7) assuming ‘obj’ is non-NULL |  
 |      (8) following ‘false’ branch (when ‘obj’ is non-NULL)... |  
|    63 |     return NULL; |  
|    64 |   obj->ob_type = ob_type; |  
 |   ~~~~~~~~~~~~~~~~~~~~~~ |  
 |                | |  
 |                (9) ...to here |  
 
 |   
 |   
  | 
     ‘new_string_obj’: event 10 
|    75 |     = (string_obj *)alloc_obj (&str_type, sizeof (string_obj) + len + 1); |  
 |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |  
 |                     | |  
 |                     (10) returning to ‘new_string_obj’ from ‘alloc_obj’ |  
 
 |   
 |   
  | 
     ‘test_1’: events 11-12 
|   101 |   base_obj *obj = new_string_obj (str); |  
 |                   ^~~~~~~~~~~~~~~~~~~~ |  
 |                   | |  
 |                   (11) returning to ‘test_1’ from ‘new_string_obj’ |  
|   102 |   unref (obj); |  
 |   ~~~~~~~~~~~       |  
 |   | |  
 |   (12) calling ‘unref’ from ‘test_1’ |  
 
 |   
   | 
  
 unref 
  | 
     ‘unref’: events 13-15 
|    89 | void unref (base_obj *obj) |  
 |      ^~~~~ |  
 |      | |  
 |      (13) entry to ‘unref’ |  
|    90 | { |  
|    91 |   if (--obj->ob_refcnt == 0) /* { dg-bogus "dereference of uninitialized pointer 'obj'" } */ |  
 |      ~ |  
 |      | |  
 |      (14) following ‘false’ branch... |  
| [...] |  |  
|    97 | } |  
 | ~      |  
 | | |  
 | (15) ...to here |  
 
 |   
 |   
  | 
     ‘test_1’: events 16-17 
|   102 |   unref (obj); |  
 |   ^~~~~~~~~~~ |  
 |   | |  
 |   (16) returning to ‘test_1’ from ‘unref’ |  
|   103 | } /* { dg-bogus "leak" "" { xfail *-*-* } } */ |  
 | ~   |  
 | | |  
 | (17) ‘obj’ leaks here; was allocated at (6) |  
 
 |   
 |