| 
  
 test_3 
  | 
     ‘test_3’: events 1-2 
|    46 | void test_3 (void *ptr) |  
 |      ^~~~~~ |  
 |      | |  
 |      (1) entry to ‘test_3’ |  
|    47 | { |  
|    48 |   called_by_test_3 (ptr, free); |  
 |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |  
 |   | |  
 |   (2) calling ‘called_by_test_3’ from ‘test_3’ |  
 
 |   
   | 
  
 called_by_test_3 
  | 
     ‘called_by_test_3’: events 3-4 
|    41 | called_by_test_3 (void *ptr, deallocator_t dealloc_fn) |  
 | ^~~~~~~~~~~~~~~~ |  
 | | |  
 | (3) entry to ‘called_by_test_3’ |  
|    42 | { |  
|    43 |   dealloc_fn (ptr); /* { dg-warning "double-'free'" } */ |  
 |   ~~~~~~~~~~~~~~~~ |  
 |   | |  
 |   (4) first ‘free’ here |  
 
 |   
 |   
  | 
     ‘test_3’: events 5-6 
|    48 |   called_by_test_3 (ptr, free); |  
 |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ |  
 |   | |  
 |   (5) returning to ‘test_3’ from ‘called_by_test_3’ |  
|    49 |   called_by_test_3 (ptr, free); |  
 |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |  
 |   | |  
 |   (6) passing freed pointer ‘ptr’ in call to ‘called_by_test_3’ from ‘test_3’ |  
 
 |   
   | 
  
 called_by_test_3 
  | 
     ‘called_by_test_3’: events 7-8 
|    41 | called_by_test_3 (void *ptr, deallocator_t dealloc_fn) |  
 | ^~~~~~~~~~~~~~~~ |  
 | | |  
 | (7) entry to ‘called_by_test_3’ |  
|    42 | { |  
|    43 |   dealloc_fn (ptr); /* { dg-warning "double-'free'" } */ |  
 |   ~~~~~~~~~~~~~~~~ |  
 |   | |  
 |   (8) second ‘free’ here; first ‘free’ was at (4) |  
 
 |   
 |   
 |