| 
  
 test_1 
  | 
     ‘test_1’: events 1-4 
|    11 | void test_1 (void *ptr, int a, int b) |  
 |      ^~~~~~ |  
 |      | |  
 |      (1) entry to ‘test_1’ |  
|    12 | { |  
|    13 |   if (a) |  
 |      ~ |  
 |      | |  
 |      (2) following ‘true’ branch (when ‘a != 0’)... |  
|    14 |     calls_free_1 (ptr); |  
 |     ~~~~~~~~~~~~~~~~~~ |  
 |     | |  
 |     (3) ...to here |  
 |     (4) calling ‘calls_free_1’ from ‘test_1’ |  
 
 |   
   | 
  
 calls_free_1 
  | 
     ‘calls_free_1’: events 5-6 
|     6 | void calls_free_1 (void *ptr) |  
 |      ^~~~~~~~~~~~ |  
 |      | |  
 |      (5) entry to ‘calls_free_1’ |  
|     7 | { |  
|     8 |   free (ptr); /* { dg-warning "double-'free' of 'ptr'" } */ |  
 |   ~~~~~~~~~~ |  
 |   | |  
 |   (6) first ‘free’ here |  
 
 |   
 |   
  | 
     ‘test_1’: events 7-10 
|    14 |     calls_free_1 (ptr); |  
 |     ^~~~~~~~~~~~~~~~~~ |  
 |     | |  
 |     (7) returning to ‘test_1’ from ‘calls_free_1’ |  
|    15 |  |  
|    16 |   if (b) |  
 |      ~ |  
 |      | |  
 |      (8) following ‘false’ branch (when ‘b == 0’)... |  
| [...] |  |  
|    20 |     calls_free_1 (ptr); |  
 |     ~~~~~~~~~~~~~~~~~~ |  
 |     | |  
 |     (9) ...to here |  
 |     (10) passing freed pointer ‘ptr’ in call to ‘calls_free_1’ from ‘test_1’ |  
 
 |   
   | 
  
 calls_free_1 
  | 
     ‘calls_free_1’: events 11-12 
|     6 | void calls_free_1 (void *ptr) |  
 |      ^~~~~~~~~~~~ |  
 |      | |  
 |      (11) entry to ‘calls_free_1’ |  
|     7 | { |  
|     8 |   free (ptr); /* { dg-warning "double-'free' of 'ptr'" } */ |  
 |   ~~~~~~~~~~ |  
 |   | |  
 |   (12) second ‘free’ here; first ‘free’ was at (6) |  
 
 |   
 |   
 |