| 
              
                 
                  test_1
                 
                
                  
                    | 
                       test_1: events 1-2 
                      
                        
                          |    73 |   | void test_1 (const char *str) |  
                          |       |   |      ^~~~~~ |  
                          |       |   |      | |  
                          |       |   |      (1) entry to ‘test_1’ |  
                          |    74 |   | { |  
                          |    75 |   |   string_obj *obj = new_string_obj (str); |  
                          |       |   |                     ~~~~~~~~~~~~~~~~~~~~ |  
                          |       |   |                     | |  
                          |       |   |                     (2) calling ‘new_string_obj’ from ‘test_1’ |  
                        
                       
                     | 
                   
                 
                
                  
                     | 
                    
                       
                        new_string_obj
                       
                      
                        
                          | 
                             new_string_obj: events 3-4 
                            
                              
                                |    47 |   | string_obj *new_string_obj (const char *str) |  
                                |       |   |             ^~~~~~~~~~~~~~ |  
                                |       |   |             | |  
                                |       |   |             (3) entry to ‘new_string_obj’ |  
                              
| [...] |  |  
                              
                                |    53 |   |     = (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 
                                  
                                    
                                      |    37 |   | base_obj *alloc_obj (type_obj *ob_type, size_t sz) |  
                                      |       |   |           ^~~~~~~~~ |  
                                      |       |   |           | |  
                                      |       |   |           (5) entry to ‘alloc_obj’ |  
                                      |    38 |   | { |  
                                      |    39 |   |   base_obj *obj = (base_obj *)malloc (sz); |  
                                      |       |   |                               ~~~~~~~~~~~ |  
                                      |       |   |                               | |  
                                      |       |   |                               (6) allocated here
  |  
                                      |    40 |   |   if (!obj) |  
                                      |       |   |      ~      |  
                                      |       |   |      | |  
                                      |       |   |      (7) assuming ‘obj’ is non-NULL
  |  
                                      |       |   |      (8) following ‘false’ branch (when ‘obj’ is non-NULL)... ─>─┐ |  
                                      |       |   |                                                                  │ |  
                                      |       |   |                                                                  │ |  
                                      |       | ┌ | ─────────────────────────────────────────────────────────────────┘ |  
                                      |    41 | │ |     return NULL; /* { dg-message "using NULL here" } */ |  
                                      |    42 | │ |   obj->ob_type = ob_type; |  
                                      |       | │ |   ~~~~~~~~~~~~~~~~~~~~~~ |  
                                      |       | │ |                | |  
                                      |       | └ | ──────────────>(9) ...to here |  
                                    
                                   
                                 | 
                               
                             
                           | 
                         
                       
                      
                        
                          | 
                             new_string_obj: event 10 
                            
                              
                                |    53 |   |     = (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 
                      
                        
                          |    75 |   |   string_obj *obj = new_string_obj (str); |  
                          |       |   |                     ^~~~~~~~~~~~~~~~~~~~ |  
                          |       |   |                     | |  
                          |       |   |                     (11) returning to ‘test_1’ from ‘new_string_obj’ |  
                          |    76 |   |   if (obj) |  
                          |       |   |      ~                |  
                          |       |   |      | |  
                          |       |   |      (12) following ‘true’ branch (when ‘obj’ is non-NULL)... ─>─┐ |  
                          |       |   |                                                                  │ |  
                          |       |   |                                                                  │ |  
                          |       | ┌ | ─────────────────────────────────────────────────────────────────┘ |  
                          |    77 | │ |     unref (obj); |  
                          |       | │ |     ~~~~~~~~~~~       |  
                          |       | │ |     | |  
                          |       | └ | ───>(13) ...to here |  
                          |       |   |     (14) calling ‘unref’ from ‘test_1’ |  
                        
                       
                     | 
                   
                 
                
                  
                     | 
                    
                       
                        unref
                       
                      
                        
                          | 
                             unref: events 15-17 
                            
                              
                                |    67 |   | void unref (string_obj *obj) |  
                                |       |   |      ^~~~~ |  
                                |       |   |      | |  
                                |       |   |      (15) entry to ‘unref’ |  
                                |    68 |   | { |  
                                |    69 |   |   if (--obj->str_base.ob_refcnt == 0) |  
                                |       |   |      ~ |  
                                |       |   |      | |  
                                |       |   |      (16) following ‘false’ branch... ─>─┐ |  
                                |       |   |                                          │ |  
                                |       |   |                                          │ |  
                                |       | ┌ | ─────────────────────────────────────────┘ |  
                                |    70 | │ |     free (obj); |  
                                |    71 | │ | } |  
                                |       | │ | ~      |  
                                |       | │ | | |  
                                |       | └ | (17) ...to here |  
                              
                             
                           | 
                         
                       
                     | 
                   
                 
                
                  
                    | 
                       test_1: events 18-19 
                      
                        
                          |    77 |   |     unref (obj); |  
                          |       |   |     ^~~~~~~~~~~ |  
                          |       |   |     | |  
                          |       |   |     (18) returning to ‘test_1’ from ‘unref’ |  
                          |    78 |   | } /* { dg-bogus "leak" "" { xfail *-*-* } } */ |  
                          |       |   | ~     |  
                          |       |   | | |  
                          |       |   | (19) ⚠️  ‘obj’ leaks here; was allocated at (6)
  |  
                        
                       
                     | 
                   
                 
               |