From c6c8de1609da38a4ffb6dbed8047491d85d57e3d Mon Sep 17 00:00:00 2001 From: Theophile Ranquet Date: Thu, 4 Oct 2012 10:35:42 +0000 Subject: [PATCH 1/1] errors: support indented context info in m4 macros * TODO: Address the issue, so remove it. * data/bison.m4: Use b4_error with [[note]] rather than a complain_at for context information. * src/complain.c (complain_args): Take an additional argument, an indentation pointer, to allow the dispatching of context information. * src/complain.h (complain_args): Adjust prototype. * src/scan-skel.l (at_directive_perform): Recognize the new @note mark. * tests/input.at: Adjust. Signed-off-by: Akim Demaille --- TODO | 4 ---- data/bison.m4 | 2 +- src/complain.c | 16 ++++++++-------- src/complain.h | 3 ++- src/scan-skel.l | 13 +++++++++++-- tests/input.at | 12 ++++++------ 6 files changed, 28 insertions(+), 22 deletions(-) diff --git a/TODO b/TODO index cce754bb..40127468 100644 --- a/TODO +++ b/TODO @@ -1,8 +1,4 @@ * Short term -** erroneous test -src/complains.c changed the output of errors (prefixes), but the m4 macros -have not been changed to reflect this change. -Fix the message "an identifier expected" (m4) in tests/input.at. ** push-parser Check it too when checking the different kinds of parsers. And be diff --git a/data/bison.m4 b/data/bison.m4 index 56ccc38f..1907e42e 100644 --- a/data/bison.m4 +++ b/data/bison.m4 @@ -743,7 +743,7 @@ m4_define([_b4_percent_define_check_values], [$1], m4_dquote(m4_indir([b4_percent_define(]$1[)]))) m4_foreach([b4_value], m4_dquote(m4_shift($@)), - [b4_complain_at(b4_percent_define_get_loc([$1]), + [b4_error([[note]], b4_percent_define_get_loc([$1]), [] [[accepted value: '%s']], m4_dquote(b4_value))])])dnl m4_popdef([b4_good_value])], diff --git a/src/complain.c b/src/complain.c index 020b688b..985ef404 100644 --- a/src/complain.c +++ b/src/complain.c @@ -120,11 +120,9 @@ error_message (const location *loc, warnings flags, const char *prefix, /** Raise a complaint. That can be a fatal error, a complaint or just a warning. */ - static inline void complains (const location *loc, warnings flags, const char *message, va_list args) - { const char* prefix = flags & fatal ? _("fatal error") @@ -159,24 +157,26 @@ complain_indent (location const *loc, warnings flags, unsigned *indent, } void -complain_args (location const *loc, warnings w, int argc, char *argv[]) +complain_args (location const *loc, warnings w, unsigned *indent, + int argc, char *argv[]) { switch (argc) { case 2: - complain (loc, w, "%s", _(argv[1])); + complain_indent (loc, w, indent, "%s", _(argv[1])); break; case 3: - complain (loc, w, _(argv[1]), argv[2]); + complain_indent (loc, w, indent, _(argv[1]), argv[2]); break; case 4: - complain (loc, w, _(argv[1]), argv[2], argv[3]); + complain_indent (loc, w, indent, _(argv[1]), argv[2], argv[3]); break; case 5: - complain (loc, w, _(argv[1]), argv[2], argv[3], argv[4]); + complain_indent (loc, w, indent, _(argv[1]), argv[2], argv[3], argv[4]); break; case 6: - complain (loc, w, _(argv[1]), argv[2], argv[3], argv[4], argv[5]); + complain_indent (loc, w, indent, _(argv[1]), argv[2], argv[3], argv[4], + argv[5]); break; default: complain (loc, fatal, "too many arguments for complains"); diff --git a/src/complain.h b/src/complain.h index be0d7f50..6a871d82 100644 --- a/src/complain.h +++ b/src/complain.h @@ -62,7 +62,8 @@ void complain (location const *loc, warnings flags, char const *message, ...) __attribute__ ((__format__ (__printf__, 3, 4))); /** Likewise, but with an \a argc/argv interface. */ -void complain_args (location const *loc, warnings w, int argc, char *arg[]); +void complain_args (location const *loc, warnings w, unsigned *indent, + int argc, char *arg[]); /** Make a complaint with location and some indentation. */ void complain_indent (location const *loc, warnings flags, unsigned *indent, diff --git a/src/scan-skel.l b/src/scan-skel.l index 662a00b2..84162572 100644 --- a/src/scan-skel.l +++ b/src/scan-skel.l @@ -175,6 +175,8 @@ flag (const char *arg) return complaint; else if (STREQ (arg, "fatal")) return fatal; + else if (STREQ (arg, "note")) + return silent; else aver (false); } @@ -190,9 +192,12 @@ at_directive_perform (int argc, char *argv[], char **outnamep, int *out_linenop) } else if (STREQ (argv[0], "@complain")) { + static unsigned indent; if (argc < 4) fail_for_at_directive_too_few_args (argv[0]); warnings w = flag (argv[1]); + if ((w & silent) != silent) + indent = 0; location loc; location *locp = NULL; if (argv[2] && argv[2][0]) @@ -201,8 +206,12 @@ at_directive_perform (int argc, char *argv[], char **outnamep, int *out_linenop) boundary_set_from_string (&loc.end, argv[3]); locp = &loc; } - complain_args (locp, w, argc - 3, argv + 3); - } + if (w & silent) + indent += SUB_INDENT; + complain_args (locp, w, &indent, argc - 3, argv + 3); + if (w & silent) + indent -= SUB_INDENT; + } else if (STREQ (argv[0], "@output")) { if (argc > 2) diff --git a/tests/input.at b/tests/input.at index ac9be79d..30107218 100644 --- a/tests/input.at +++ b/tests/input.at @@ -1159,9 +1159,9 @@ start: ; ]]) AT_BISON_CHECK([[input.y]], [1], [], [[input.y:1.9-21: error: invalid value for %define variable 'api.push-pull': 'neither' -input.y:1.9-21: error: accepted value: 'pull' -input.y:1.9-21: error: accepted value: 'push' -input.y:1.9-21: error: accepted value: 'both' +input.y:1.9-21: accepted value: 'pull' +input.y:1.9-21: accepted value: 'push' +input.y:1.9-21: accepted value: 'both' ]]) AT_CLEANUP @@ -1183,9 +1183,9 @@ start: ; AT_BISON_CHECK([[input.y]], [1], [], [[input.y:1.9-21: warning: deprecated %define variable name: 'api.push_pull', use 'api.push-pull' [-Wdeprecated] input.y:1.9-21: error: invalid value for %define variable 'api.push-pull': 'neither' -input.y:1.9-21: error: accepted value: 'pull' -input.y:1.9-21: error: accepted value: 'push' -input.y:1.9-21: error: accepted value: 'both' +input.y:1.9-21: accepted value: 'pull' +input.y:1.9-21: accepted value: 'push' +input.y:1.9-21: accepted value: 'both' ]]) AT_DATA([[input.y]], -- 2.45.2