| 
  
 test 
  | 
     ‘test’: events 1-2 
|    10 | void test (void *q) |  
 |      ^~~~ |  
 |      | |  
 |      (1) entry to ‘test’ |  
|    11 | { |  
|    12 |   calls_free (q); |  
 |   ~~~~~~~~~~~~~~ |  
 |   | |  
 |   (2) calling ‘calls_free’ from ‘test’ |  
 
 |   
   | 
  
 calls_free 
  | 
     ‘calls_free’: events 3-4 
|     5 | void calls_free (void *p) |  
 |      ^~~~~~~~~~ |  
 |      | |  
 |      (3) entry to ‘calls_free’ |  
|     6 | { |  
|     7 |   free (p); /* { dg-warning "double-'free' of 'p'" } */ |  
 |   ~~~~~~~~ |  
 |   | |  
 |   (4) first ‘free’ here |  
 
 |   
 |   
  | 
     ‘test’: events 5-6 
|    12 |   calls_free (q); |  
 |   ^~~~~~~~~~~~~~ |  
 |   | |  
 |   (5) returning to ‘test’ from ‘calls_free’ |  
|    13 |   calls_free (q); |  
 |   ~~~~~~~~~~~~~~ |  
 |   | |  
 |   (6) passing freed pointer ‘q’ in call to ‘calls_free’ from ‘test’ |  
 
 |   
   | 
  
 calls_free 
  | 
     ‘calls_free’: events 7-8 
|     5 | void calls_free (void *p) |  
 |      ^~~~~~~~~~ |  
 |      | |  
 |      (7) entry to ‘calls_free’ |  
|     6 | { |  
|     7 |   free (p); /* { dg-warning "double-'free' of 'p'" } */ |  
 |   ~~~~~~~~ |  
 |   | |  
 |   (8) second ‘free’ here; first ‘free’ was at (4) |  
 
 |   
 |   
 |