From: David Malcolm Date: Tue, 31 Jul 2018 21:08:55 +0000 (+0000) Subject: c-family: clean up the data tables in c-format.c X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e540ccc0e281a6e30c14e55b39334db27e55b3bf;p=gcc.git c-family: clean up the data tables in c-format.c 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. 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. From-SVN: r263181 --- diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index bf1232e42a3..eb9cbc5bb06 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,16 @@ +2018-07-31 David Malcolm + + * 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". + 2018-07-31 Richard Earnshaw * c-common.c (speculation_safe_resolve_call): New function. diff --git a/gcc/c-family/c-format.c b/gcc/c-family/c-format.c index a0192dd3296..82841e454c7 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/ChangeLog b/gcc/testsuite/ChangeLog index f0d258e8308..b764a6504a5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2018-07-31 David Malcolm + + * 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. + 2018-07-31 Richard Earnshaw * c-c++-common/spec-barrier-1.c: New test. diff --git a/gcc/testsuite/gcc.dg/format/gcc_diag-1.c b/gcc/testsuite/gcc.dg/format/gcc_diag-1.c index 4dcdb05b8b9..034e0974d22 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 9bda73bc628..ab9bc2fff34 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 ("%%>"); /* { 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%>", "");