https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77672
--- Comment #4 from David Malcolm <dmalcolm at gcc dot gnu.org> --- (In reply to Martin Sebor from comment #2) > I think the general improvement I'm suggesting is to be able to put the > tilde(s) under or point the caret at any character of the format string, > including either of the two quotes. If desired, you can use make_location to construct a location_t for such situations... though I'm not sure that it makes sense to do so for all of the different combinations. I've tried to make class substring_loc provide the API needed for the common case. > It's already possible to underscore the whole format string and point the > caret at any character within in, including the first quote, so it seems > natural to also point the caret at the last quote. r240434 updates things so that substring_loc::get_location uses the final quote for the location of the NUL-terminator character for STRING_CSTs from the C frontend, so that if that character's index is passed as one of the indices to substring_loc's constructor, it will handle that (previously, doing so would lead to substring_loc::get_location, leading to format_warning using the whole string range, with both start and end quotes). The output for the test case is now: $ ./xgcc -B. -c v.c -Wall v.c: In function ‘f’: v.c:6:19: warning: writing format character ‘!’ at offset 3 past the end of the destination [-Wformat-length=] sprintf (d, "%-s!", "abc"); ^ v.c:6:3: note: format output 5 bytes into a destination of size 3 sprintf (d, "%-s!", "abc"); ^~~~~~~~~~~~~~~~~~~~~~~~~~ v.c: In function ‘g’: v.c:10:18: warning: writing a terminating nul past the end of the destination [-Wformat-length=] sprintf (d, "%-s", "abc"); ~~^~ v.c:10:3: note: format output 4 bytes into a destination of size 3 sprintf (d, "%-s", "abc"); ^~~~~~~~~~~~~~~~~~~~~~~~~ Note how in the warning for g it has underlined from the first char through to the close-quote, with the caret on the s. This is with: (gdb) p fmt_loc $1 = (const substring_loc &) @0x7fffffffda90: {m_fmt_string_loc = 2147483655, m_string_type = <pointer_type 0x7ffff19e97e0>, m_caret_idx = 2, m_start_idx = 0, m_end_idx = 3} so it is faithfully printing the idx values it's been provided with by the diagnostic code.