This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH 4/5] c-family: clean up the data tables in c-format.c
On Fri, Jul 27, 2018 at 11:48 PM David Malcolm <dmalcolm@redhat.com> wrote:
>
> The format_char_info tables in c-format.c for our own formats contain
> a lot of repetition.
>
> This patch adds a macro to express the conversion specifiers implemented
> within pp_format, making it clearer which are custom ones added by the
> various diagnostic_format_decoder callbacks.
>
> Doing so uncovered a few mistakes in the data (based on comparison with
> the source of the diagnostic_format_decoder callbacks, and the notes
> below), which the patch fixes:
>
> - gcc_diag_char_table didn't have 'Z', but it *is* implemented by pp_format.
>
> - removed erroneous 'G' and 'K' entries from gcc_diag_char_table: they're
> implemented by default_tree_printer (and thus in "tdiag") and by the
> C/C++ FEs, but not in pp_format.
>
> - removed "v" (lower case) from gcc_tdiag_char_table and
> gcc_cxxdiag_char_table
>
> Notes:
>
> pretty-print.h uses this for ATTRIBUTE_GCC_PPDIAG, used by pp_printf
> and pp_verbatim:
>
> whereas diagnostic-core.h uses this for ATTRIBUTE_GCC_DIAG, used by
> the various diagnostic functions:
>
> /* If we haven't already defined a front-end-specific diagnostics
> style, use the generic one. */
>
> Hence I'm assuming that __gcc_diag__ is for use for when we don't
> know what kind of diagnostic_format_decoder we have, and we can
> only rely on pp_format's core functionality, where __gcc_tdiag__
> is allowed to assume default_tree_printer.
OK if nobody objects.
Thanks,
Richard.
> gcc/c-family/ChangeLog:
> * c-format.c (PP_FORMAT_CHAR_TABLE): New macro, based on existing
> table entries for gcc_diag_char_table, and the 'Z' entry from
> gcc_tdiag_char_table, changing the "chain" entry for 'Z' from
> &gcc_tdiag_char_table[0] to &gcc_diag_char_table[0].
> (gcc_diag_char_table): Use PP_FORMAT_CHAR_TABLE, implicitly
> adding missing "Z" for this table. Remove erroneous "G" and "K"
> entries.
> (gcc_tdiag_char_table): Use PP_FORMAT_CHAR_TABLE. Remove "v".
> (gcc_cdiag_char_table): Use PP_FORMAT_CHAR_TABLE.
> (gcc_cxxdiag_char_table): Use PP_FORMAT_CHAR_TABLE. Remove "v".
>
> gcc/testsuite/ChangeLog:
> * gcc.dg/format/gcc_diag-1.c (foo): Update the %v tests for
> tdiag and cxxdiag.
> * gcc.dg/format/gcc_diag-10.c (test_diag): Update tests of %G
> and %K.
> ---
> gcc/c-family/c-format.c | 99 ++++++++++---------------------
> gcc/testsuite/gcc.dg/format/gcc_diag-1.c | 4 +-
> gcc/testsuite/gcc.dg/format/gcc_diag-10.c | 7 +--
> 3 files changed, 35 insertions(+), 75 deletions(-)
>
> diff --git a/gcc/c-family/c-format.c b/gcc/c-family/c-format.c
> index a0192dd..82841e4 100644
> --- a/gcc/c-family/c-format.c
> +++ b/gcc/c-family/c-format.c
> @@ -679,43 +679,40 @@ static const format_char_info asm_fprintf_char_table[] =
> { NULL, 0, STD_C89, NOLENGTHS, NULL, NULL, NULL }
> };
>
> +/* GCC-specific format_char_info arrays. */
> +
> +/* The conversion specifiers implemented within pp_format, and thus supported
> + by all pretty_printer instances within GCC. */
> +
> +#define PP_FORMAT_CHAR_TABLE \
> + { "di", 0, STD_C89, { T89_I, BADLEN, BADLEN, T89_L, T9L_LL, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL }, \
> + { "ox", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL }, \
> + { "u", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL }, \
> + { "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL }, \
> + { "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "pq", "cR", NULL }, \
> + { "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "c", NULL }, \
> + { "r", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "//cR", NULL }, \
> + { "<", 0, STD_C89, NOARGUMENTS, "", "<", NULL }, \
> + { ">", 0, STD_C89, NOARGUMENTS, "", ">", NULL }, \
> + { "'" , 0, STD_C89, NOARGUMENTS, "", "", NULL }, \
> + { "R", 0, STD_C89, NOARGUMENTS, "", "\\", NULL }, \
> + { "m", 0, STD_C89, NOARGUMENTS, "q", "", NULL }, \
> + { "Z", 1, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "", &gcc_diag_char_table[0] }
> +
> static const format_char_info gcc_diag_char_table[] =
> {
> - /* C89 conversion specifiers. */
> - { "di", 0, STD_C89, { T89_I, BADLEN, BADLEN, T89_L, T9L_LL, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL },
> - { "ox", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL },
> - { "u", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL },
> - { "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL },
> - { "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "pq", "cR", NULL },
> - { "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "c", NULL },
> -
> - /* Custom conversion specifiers. */
> + /* The conversion specifiers implemented within pp_format. */
> + PP_FORMAT_CHAR_TABLE,
>
> - /* G requires a "gcall*" argument at runtime. */
> - { "G", 1, STD_C89, { T89_G, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "\"", NULL },
> - /* K requires a "tree" argument at runtime. */
> - { "K", 1, STD_C89, { T89_T, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "\"", NULL },
> -
> - { "r", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "//cR", NULL },
> - { "<", 0, STD_C89, NOARGUMENTS, "", "<", NULL },
> - { ">", 0, STD_C89, NOARGUMENTS, "", ">", NULL },
> - { "'" , 0, STD_C89, NOARGUMENTS, "", "", NULL },
> - { "R", 0, STD_C89, NOARGUMENTS, "", "\\", NULL },
> - { "m", 0, STD_C89, NOARGUMENTS, "q", "", NULL },
> { NULL, 0, STD_C89, NOLENGTHS, NULL, NULL, NULL }
> };
>
> static const format_char_info gcc_tdiag_char_table[] =
> {
> - /* C89 conversion specifiers. */
> - { "di", 0, STD_C89, { T89_I, BADLEN, BADLEN, T89_L, T9L_LL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL },
> - { "ox", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL },
> - { "u", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL },
> - { "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL },
> - { "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "pq", "cR", NULL },
> - { "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "c", NULL },
> + /* The conversion specifiers implemented within pp_format. */
> + PP_FORMAT_CHAR_TABLE,
>
> - /* Custom conversion specifiers. */
> + /* Custom conversion specifiers implemented by default_tree_printer. */
>
> /* These will require a "tree" at runtime. */
> { "DFTV", 1, STD_C89, { T89_T, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q+", "'", NULL },
> @@ -725,29 +722,15 @@ static const format_char_info gcc_tdiag_char_table[] =
> /* G requires a "gcall*" argument at runtime. */
> { "G", 1, STD_C89, { T89_G, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "\"", NULL },
>
> - { "v", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q#", "", NULL },
> -
> - { "r", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "/cR", NULL },
> - { "<", 0, STD_C89, NOARGUMENTS, "", "<", NULL },
> - { ">", 0, STD_C89, NOARGUMENTS, "", ">", NULL },
> - { "'", 0, STD_C89, NOARGUMENTS, "", "", NULL },
> - { "R", 0, STD_C89, NOARGUMENTS, "", "\\", NULL },
> - { "m", 0, STD_C89, NOARGUMENTS, "q", "", NULL },
> - { "Z", 1, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "", &gcc_tdiag_char_table[0] },
> { NULL, 0, STD_C89, NOLENGTHS, NULL, NULL, NULL }
> };
>
> static const format_char_info gcc_cdiag_char_table[] =
> {
> - /* C89 conversion specifiers. */
> - { "di", 0, STD_C89, { T89_I, BADLEN, BADLEN, T89_L, T9L_LL, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL },
> - { "ox", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL },
> - { "u", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL },
> - { "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL },
> - { "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "pq", "cR", NULL },
> - { "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "c", NULL },
> + /* The conversion specifiers implemented within pp_format. */
> + PP_FORMAT_CHAR_TABLE,
>
> - /* Custom conversion specifiers. */
> + /* Custom conversion specifiers implemented by c_tree_printer. */
>
> /* These will require a "tree" at runtime. */
> { "DFTV", 1, STD_C89, { T89_T, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q+", "'", NULL },
> @@ -759,33 +742,20 @@ static const format_char_info gcc_cdiag_char_table[] =
>
> { "v", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q#", "", NULL },
>
> - { "r", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "/cR", NULL },
> - { "<", 0, STD_C89, NOARGUMENTS, "", "<", NULL },
> - { ">", 0, STD_C89, NOARGUMENTS, "", ">", NULL },
> - { "'", 0, STD_C89, NOARGUMENTS, "", "", NULL },
> - { "R", 0, STD_C89, NOARGUMENTS, "", "\\", NULL },
> - { "m", 0, STD_C89, NOARGUMENTS, "q", "", NULL },
> - { "Z", 1, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "", &gcc_tdiag_char_table[0] },
> { NULL, 0, STD_C89, NOLENGTHS, NULL, NULL, NULL }
> };
>
> static const format_char_info gcc_cxxdiag_char_table[] =
> {
> - /* C89 conversion specifiers. */
> - { "di", 0, STD_C89, { T89_I, BADLEN, BADLEN, T89_L, T9L_LL, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL },
> - { "ox", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL },
> - { "u", 0, STD_C89, { T89_UI, BADLEN, BADLEN, T89_UL, T9L_ULL, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL },
> - { "c", 0, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL },
> - { "s", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "pq", "cR", NULL },
> - { "p", 1, STD_C89, { T89_V, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "c", NULL },
> + /* The conversion specifiers implemented within pp_format. */
> + PP_FORMAT_CHAR_TABLE,
>
> - /* Custom conversion specifiers. */
> + /* Custom conversion specifiers implemented by cp_printer. */
>
> /* These will require a "tree" at runtime. */
> { "ADFHISTVX",1,STD_C89,{ T89_T, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q+#", "'", NULL },
> { "E", 1,STD_C89,{ T89_T, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q+#", "", NULL },
> { "K", 1, STD_C89,{ T89_T, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "\"", NULL },
> - { "v", 0,STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q#", "", NULL },
>
> /* G requires a "gcall*" argument at runtime. */
> { "G", 1, STD_C89,{ T89_G, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "\"", NULL },
> @@ -793,13 +763,6 @@ static const format_char_info gcc_cxxdiag_char_table[] =
> /* These accept either an 'int' or an 'enum tree_code' (which is handled as an 'int'.) */
> { "CLOPQ",0,STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "q", "", NULL },
>
> - { "r", 1, STD_C89, { T89_C, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "/cR", NULL },
> - { "<", 0, STD_C89, NOARGUMENTS, "", "<", NULL },
> - { ">", 0, STD_C89, NOARGUMENTS, "", ">", NULL },
> - { "'", 0, STD_C89, NOARGUMENTS, "", "", NULL },
> - { "R", 0, STD_C89, NOARGUMENTS, "", "\\", NULL },
> - { "m", 0, STD_C89, NOARGUMENTS, "q", "", NULL },
> - { "Z", 1, STD_C89, { T89_I, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN, BADLEN }, "", "", &gcc_tdiag_char_table[0] },
> { NULL, 0, STD_C89, NOLENGTHS, NULL, NULL, NULL }
> };
>
> diff --git a/gcc/testsuite/gcc.dg/format/gcc_diag-1.c b/gcc/testsuite/gcc.dg/format/gcc_diag-1.c
> index 4dcdb05..034e097 100644
> --- a/gcc/testsuite/gcc.dg/format/gcc_diag-1.c
> +++ b/gcc/testsuite/gcc.dg/format/gcc_diag-1.c
> @@ -87,9 +87,9 @@ foo (int i, int i1, int i2, unsigned int u, double d, char *s, void *p,
> cxxdiag ("%<%+#A%+#D%+#E%+#F%+#T%+#V%>", t1, t1, t1, t1, t1, t1);
> cxxdiag ("%C%L%O%P%Q", i, i, i, i, i);
>
> - tdiag ("%v%qv%#v", i, i, i);
> + tdiag ("%v", i); /* { dg-warning "format" } */
> cdiag ("%v%qv%#v", i, i, i);
> - cxxdiag ("%v%qv%#v", i, i, i);
> + cxxdiag ("%v", i); /* { dg-warning "format" } */
>
> tdiag ("%Z", v, v_len);
> cdiag ("%Z", v, v_len);
> diff --git a/gcc/testsuite/gcc.dg/format/gcc_diag-10.c b/gcc/testsuite/gcc.dg/format/gcc_diag-10.c
> index 9bda73b..ab9bc2f 100644
> --- a/gcc/testsuite/gcc.dg/format/gcc_diag-10.c
> +++ b/gcc/testsuite/gcc.dg/format/gcc_diag-10.c
> @@ -32,8 +32,8 @@ void test_diag (tree t, gcall *gc)
> diag ("%>"); /* { dg-warning "unmatched quoting directive " } */
> diag ("%<foo%<bar%>%>"); /* { dg-warning "nested quoting directive" } */
>
> - diag ("%G", gc);
> - diag ("%K", t);
> + diag ("%G", gc); /* { dg-warning "format" } */
> + diag ("%K", t); /* { dg-warning "format" } */
>
> diag ("%R"); /* { dg-warning "unmatched color reset directive" } */
> diag ("%r", ""); /* { dg-warning "unterminated color directive" } */
> @@ -42,9 +42,6 @@ void test_diag (tree t, gcall *gc)
> diag ("%r%r%R", "", "");
> diag ("%r%R%r%R", "", "");
>
> - diag ("%<%G%>", gc); /* { dg-warning ".G. conversion used within a quoted sequence" } */
> - diag ("%<%K%>", t); /* { dg-warning ".K. conversion used within a quoted sequence" } */
> -
> diag ("%<%R%>"); /* { dg-warning "unmatched color reset directive" } */
> diag ("%<%r%>", ""); /* { dg-warning "unterminated color directive" } */
> diag ("%<%r%R%>", "");
> --
> 1.8.5.3
>