I noticed that format_pieces can create an empty literal piece.
However, there's never a need for one, so this patch removes the
possibility.
gdb/ChangeLog
2019-10-01 Tom Tromey <tom@tromey.com>
* unittests/format_pieces-selftests.c: Update. Add final format.
* gdbsupport/format.c (format_pieces::format_pieces): Don't add
empty literal pieces.
+2019-10-01 Tom Tromey <tom@tromey.com>
+
+ * unittests/format_pieces-selftests.c: Update. Add final format.
+ * gdbsupport/format.c (format_pieces::format_pieces): Don't add
+ empty literal pieces.
+
2019-10-01 Tom Tromey <tom@tromey.com>
* ui-out.h (enum class ui_out_style_kind): Remove.
current_substring += f - 1 - prev_start;
*current_substring++ = '\0';
- m_pieces.emplace_back (sub_start, literal_piece);
+ if (*sub_start != '\0')
+ m_pieces.emplace_back (sub_start, literal_piece);
percent_loc = f - 1;
/* Record the remainder of the string. */
- sub_start = current_substring;
+ if (f > prev_start)
+ {
+ sub_start = current_substring;
- strncpy (current_substring, prev_start, f - prev_start);
- current_substring += f - prev_start;
- *current_substring++ = '\0';
+ strncpy (current_substring, prev_start, f - prev_start);
+ current_substring += f - prev_start;
+ *current_substring++ = '\0';
- m_pieces.emplace_back (sub_start, literal_piece);
+ m_pieces.emplace_back (sub_start, literal_piece);
+ }
}
static void
test_format_specifier ()
{
- check ("Hello %d%llx%%d", /* ARI: %ll */
+ /* The format string here ends with a % sequence, to ensure we don't
+ see a trailing empty literal piece. */
+ check ("Hello %d%llx%%d%d", /* ARI: %ll */
{
format_piece ("Hello ", literal_piece),
format_piece ("%d", int_arg),
- format_piece ("", literal_piece),
format_piece ("%llx", long_long_arg), /* ARI: %ll */
format_piece ("%%d", literal_piece),
+ format_piece ("%d", int_arg),
});
}