return label_text::borrow ("opened here");\r
\r
if (change.m_new_state == m_sm.m_closed)\r
- return change.formatted_print ("closed here");\r
+ {\r
+ m_first_close_event = change.m_event_id;\r
+ return change.formatted_print ("closed here");\r
+ }\r
\r
return fd_diagnostic::describe_state_change (change);\r
}\r
label_text\r
describe_final_event (const evdesc::final_event &ev) final override\r
{\r
- return ev.formatted_print ("%qE on closed file descriptor %qE here",\r
- m_callee_fndecl, m_arg);\r
+ if (m_first_close_event.known_p ())\r
+ return ev.formatted_print (\r
+ "%qE on closed file descriptor %qE; %qs was at %@", m_callee_fndecl,\r
+ m_arg, "close", &m_first_close_event);\r
+ else\r
+ return ev.formatted_print ("%qE on closed file descriptor %qE",\r
+ m_callee_fndecl, m_arg);\r
}\r
\r
private:\r
+ diagnostic_event_id_t m_first_close_event;\r
const tree m_callee_fndecl;\r
};\r
\r
{\r
close(fd); /* {dg-message "\\(2\\) closed here"} */\r
read(fd, buf, 1); /* { dg-warning "'read' on closed file descriptor 'fd'" } */\r
- /* {dg-message "\\(3\\) 'read' on closed file descriptor 'fd' here" "" {target *-*-*} .-1 } */\r
+ /* {dg-message "\\(3\\) 'read' on closed file descriptor 'fd'; 'close' was at \\(2\\)" "" {target *-*-*} .-1 } */\r
}\r
}\r
\r
{\r
close(fd); /* {dg-message "\\(2\\) closed here"} */\r
write(fd, buf, 1); /* { dg-warning "'write' on closed file descriptor 'fd'" } */\r
- /* {dg-message "\\(3\\) 'write' on closed file descriptor 'fd' here" "" {target *-*-*} .-1 } */\r
+ /* {dg-message "\\(3\\) 'write' on closed file descriptor 'fd'; 'close' was at \\(2\\)" "" {target *-*-*} .-1 } */\r
}\r
}\r