1 /* { dg-do compile } */
2 /* { dg-options "-fdiagnostics-path-format=inline-events -fdiagnostics-show-caret -fdiagnostics-show-line-numbers" } */
3 /* { dg-enable-nn-line-numbers "" } */
4 
5 #include <stdio.h>
6 #include <signal.h>
7 #include <stdlib.h>
8 
9 extern void body_of_program(void);
10 
custom_logger(const char * msg)11 void custom_logger(const char *msg)
12 {
13   fprintf(stderr, "LOG: %s", msg); /* { dg-warning "call to 'fprintf' from within signal handler" } */
14 }
15 
int_handler(int signum)16 static void int_handler(int signum)
17 {
18   custom_logger("got signal");
19 }
20 
register_handler()21 static void register_handler ()
22 {
23   signal(SIGINT, int_handler);
24 }
25 
test(void)26 void test (void)
27 {
28   register_handler ();
29   body_of_program();
30 }
31 
32 /* { dg-begin-multiline-output "" }
33    NN |   fprintf(stderr, "LOG: %s", msg);
34       |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
35   'test': events 1-2
36     |
37     |   NN | {
38     |      | ^
39     |      | |
40     |      | (1) entering 'test'
41     |   NN |   register_handler ();
42     |      |   ~~~~~~~~~~~~~~~~~~~
43     |      |   |
44     |      |   (2) calling 'register_handler'
45     |
46     +--> 'register_handler': events 3-4
47            |
48            |   NN | {
49            |      | ^
50            |      | |
51            |      | (3) entering 'register_handler'
52            |   NN |   signal(SIGINT, int_handler);
53            |      |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
54            |      |   |
55            |      |   (4) registering 'int_handler' as signal handler
56            |
57   event 5
58     |
59     |cc1:
60     | (5): later on, when the signal is delivered to the process
61     |
62     +--> 'int_handler': events 6-7
63            |
64            |   NN | {
65            |      | ^
66            |      | |
67            |      | (6) entering 'int_handler'
68            |   NN |   custom_logger("got signal");
69            |      |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
70            |      |   |
71            |      |   (7) calling 'custom_logger'
72            |
73            +--> 'custom_logger': events 8-9
74                   |
75                   |   NN | {
76                   |      | ^
77                   |      | |
78                   |      | (8) entering 'custom_logger'
79                   |   NN |   fprintf(stderr, "LOG: %s", msg);
80                   |      |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
81                   |      |   |
82                   |      |   (9) calling 'fprintf'
83                   |
84    { dg-end-multiline-output "" } */
85