From 2cf5f72e9e3cbc7fdb5cb0a618db7b4fc2440a68 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 8 Nov 2012 10:25:15 +0100 Subject: [PATCH 1/5] tests: more possible error compiler messages for "#error" * tests/synclines.at (AT_SYNCLINES_COMPILE): Adjust for Clang. Verified with GCC 4.0, 4.2 to 4.8, and Clang 2.9, 3.2: none skip. --- tests/synclines.at | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/tests/synclines.at b/tests/synclines.at index 63ae6858..751db7c6 100644 --- a/tests/synclines.at +++ b/tests/synclines.at @@ -47,7 +47,8 @@ m4_define([AT_SYNCLINES_COMPILE], # => # input.y:4: #error "8" # -# The message may include a caret-error: +# The message may include a caret-error (indented by GCC 4.8, +# not by clang 3.2): # # input.y:1:2: error: #error "1" # #error "1" @@ -63,13 +64,31 @@ m4_define([AT_SYNCLINES_COMPILE], # # distcc[35882] (dcc_connect_by_name) ERROR: failed to look up host "chrisimac": Unknown host # distcc[35882] Warning: failed to distribute input.c to chrisimac/4, running locally instead - +# +# The compiler might end by the number of messages issued (Clang 3.2): +# +# syncline.c:1:2: error: "1" +# #error "1" +# ^ +# 1 error generated. AT_CHECK([[$PERL -p -0777 - stderr <<\EOF + # 1. Remove useless lines. + + # distcc clutter. s/^distcc\[\d+\] .*\n//gm; - s/^([^:]+:\d+)[.:][^:]+:(.+)$/$][1:$][2/gm; - s/^([^:]+:\d+):[^#]*( #error)/$][1:$][2/gm; + # Function context. s/^[^:]*: In function '[^']+':\n//gm; - s/^\ +#error.*\n\ *\^\n//gm; + # Caret error. + s/^ *#error.*\n *\^\n//gm; + # Number of errors. + s/^1 error generated\.\n//gm; + + # 2. Normalize the lines we kept. + + # Remove column. + s/^([^:]+:\d+)[.:][^:]+:(.+)$/$][1:$][2/gm; + # Map all combinations of "error: " and "#error: " to "#error ". + s/^([^:]+:\d+):( |#error|error|:)+/$][1: #error /gm; EOF ]], 0, [stdout]) From 3a526f5cc3b45fc68d06de0b5332105113741093 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Thu, 8 Nov 2012 19:34:29 +0100 Subject: [PATCH 2/5] tests: don't expect $EGREP to support -w Does not work on Solaris 10. Reported by Dennis Clarke. http://lists.gnu.org/archive/html/bug-bison/2012-11/msg00009.html * tests/headers.at (Several parsers): Use Perl instead. While at it, run it only once, on all the generated headers. Adjust to YY_NULL be defined in position.hh. --- THANKS | 1 + tests/headers.at | 45 ++++++++++++++++++++++++++++++--------------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/THANKS b/THANKS index 77d35be7..4e88e8f3 100644 --- a/THANKS +++ b/THANKS @@ -31,6 +31,7 @@ Dagobert Michelsen dam@baltic-online.de Daniel Hagerty hag@gnu.org David J. MacKenzie djm@gnu.org David Kastrup dak@gnu.org +Dennis Clarke dclarke@blastwave.org Derek M. Jones derek@knosof.co.uk Di-an Jan dianj@freeshell.org Dick Streefland dick.streefland@altium.nl diff --git a/tests/headers.at b/tests/headers.at index a60e3153..7df4cc9d 100644 --- a/tests/headers.at +++ b/tests/headers.at @@ -163,21 +163,6 @@ exp: AT_BISON_CHECK([-d -o AT_SKEL_CC_IF([$1.cc $1.yy], [$1.c $1.y])]) -# Check there is no 'yy' left. -# C++ output relies on namespaces and still uses yy a lot. -AT_SKEL_CC_IF([], - [AT_CHECK([$EGREP yy $1.h], [1])]) - -# Check there is not 'YY' left. -# Ignore comments, YYPARSE_PARAM (obsolete), YYPUSH_MORE(_DEFINED)? -# (constant definition), YY_\w+_INCLUDED (header guards). -# -# YYDEBUG (not renamed) can be read, but not changed. -AT_CHECK([[sed -ne 's,/\*[^*]*\*/,,g;s,//.*,,' \ - -e '/YY/p' ]$1.AT_SKEL_CC_IF([hh], [h])[ | - $EGREP -wv 'YY(PARSE_PARAM|PUSH_MORE(_DEFINED)?|_[0-9A-Z_]+_INCLUDED)|(defined|if) YYDEBUG']], - [1]) - AT_LANG_COMPILE([$1.o]) AT_CHECK([[echo "$1" >>expout]]) @@ -240,6 +225,36 @@ AT_TEST([x7], [%define api.push-pull both]) AT_TEST([x8], [%define api.pure %define api.push-pull both]) #AT_TEST([x5], [%locations %language "c++" %glr-parser]) +# Check there is no 'yy' left. +# C++ output relies on namespaces and still uses yy a lot. +# +# Check there is no 'YY' left. +# Ignore comments, YYPARSE_PARAM (obsolete), YYPUSH_MORE(_DEFINED)? +# (constant definition), YY_\w+_INCLUDED (header guards). +# +# YYDEBUG (not renamed) can be read, but not changed. +AT_CHECK([[$PERL -n -0777 -e ' + s{/\*.*?\*/}{}gs; + s{//.*}{}g; + s{\b(YYPARSE_PARAM + |YYPUSH_MORE(_DEFINED)? + |YY_\w+_INCLUDED + |YY_NULL + |(defined|if)\ YYDEBUG + )\b}{}gx; + while (/^(.*YY.*)$/gm) + { + print "$ARGV: $1\n"; + } + if ($ARGV =~ /\.h$/) + { + while (/^(.*yy.*)$/gm) + { + print "$ARGV: $1\n"; + } + } +' -- *.hh *.h]]) + # Check that the headers are self-contained, and protected against # multiple inclusions. While at it, check they are sane for C++. for h in *.h *.hh From 2bb8f621eb61ef282fadd39232a96589ba1979ad Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Sat, 10 Nov 2012 09:26:40 +0100 Subject: [PATCH 3/5] tests: use valgrind where appropriate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reported by Théophile Ranquet. * tests/glr-regression.at: Rewrite some test cases so that AT_PARSER_CHECK, which runs valgrind, is exposed with the parser, not with "echo". * tests/local.at, tests/regression.at, tests/headers.at: Use AT_PARSER_CHECK for generated parsers. --- THANKS | 1 + tests/glr-regression.at | 47 ++++++++++++++++++++++++----------------- tests/headers.at | 2 +- tests/local.at | 2 +- tests/regression.at | 2 +- 5 files changed, 32 insertions(+), 22 deletions(-) diff --git a/THANKS b/THANKS index 4e88e8f3..e815f8ed 100644 --- a/THANKS +++ b/THANKS @@ -106,6 +106,7 @@ Shura debil_urod@ngs.ru Stefano Lattarini stefano.lattarini@gmail.com Steve Murphy murf@parsetree.com Sum Wu sum@geekhouse.org +Théophile Ranquet theophile.ranquet@gmail.com Thiru Ramakrishnan thiru.ramakrishnan@gmail.com Tim Josling tej@melbpc.org.au Tim Landscheidt tim@tim-landscheidt.de diff --git a/tests/glr-regression.at b/tests/glr-regression.at index 8570b19d..aab0369f 100644 --- a/tests/glr-regression.at +++ b/tests/glr-regression.at @@ -67,9 +67,13 @@ static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1) return 0; } +const char *input = NULL; + int -main (void) +main (int argc, const char* argv[]) { + assert (argc == 2); + input = argv[1]; return yyparse (); } @@ -78,16 +82,7 @@ main (void) int yylex (void) { - for (;;) - { - int ch; - assert (!feof (stdin)); - ch = getchar (); - if (ch == EOF) - return 0; - else if (ch == 'B' || ch == 'P') - return ch; - } + return *input++; } ]]) AT_BISON_OPTION_POPDEFS @@ -96,7 +91,7 @@ AT_BISON_CHECK([[-o glr-regr1.c glr-regr1.y]], 0, [], [glr-regr1.y: conflicts: 1 shift/reduce ]) AT_COMPILE([glr-regr1]) -AT_PARSER_CHECK([[echo BPBPB | ./glr-regr1]], 0, +AT_PARSER_CHECK([[./glr-regr1 BPBPB]], 0, [[E -> 'B' E -> 'B' E -> E 'P' E @@ -212,16 +207,27 @@ AT_BISON_CHECK([[-o glr-regr2a.c glr-regr2a.y]], 0, [], ]) AT_COMPILE([glr-regr2a]) -AT_PARSER_CHECK([[echo s VARIABLE_1 t v x q | ./glr-regr2a]], 0, +AT_DATA([input1.txt], +[[s VARIABLE_1 t v x q +]]) +AT_PARSER_CHECK([[./glr-regr2a input1.txt]], 0, [[Variable: 'VARIABLE_1' -]], []) -AT_PARSER_CHECK([[echo s VARIABLE_1 , ANOTHER_VARIABLE_2 t e | ./glr-regr2a]], +]]) + +AT_DATA([input2.txt], +[[s VARIABLE_1 , ANOTHER_VARIABLE_2 t e +]]) +AT_PARSER_CHECK([[./glr-regr2a input2.txt]], 0, [[Varlist: 'VARIABLE_1,ANOTHER_VARIABLE_2' ]]) -AT_PARSER_CHECK([[echo s VARIABLE_3 t v x | ./glr-regr2a]], 0, + +AT_DATA([input3.txt], +[[s VARIABLE_3 t v x +]]) +AT_PARSER_CHECK([[./glr-regr2a input3.txt]], 0, [[Variable: 'VARIABLE_3' -]], []) +]]) AT_CLEANUP @@ -329,10 +335,13 @@ AT_BISON_CHECK([[-o glr-regr3.c glr-regr3.y]], 0, [], ]) AT_COMPILE([glr-regr3]) -AT_PARSER_CHECK([[echo p1 t4 o2 p1 p1 t1 o1 t2 p2 o1 t3 p2 p2 | ./glr-regr3]], +AT_DATA([input.txt], +[[p1 t4 o2 p1 p1 t1 o1 t2 p2 o1 t3 p2 p2 +]]) +AT_PARSER_CHECK([[./glr-regr3 input.txt]], 0, [[Result: 1c04 -]], []) +]]) AT_CLEANUP diff --git a/tests/headers.at b/tests/headers.at index 7df4cc9d..b53ee8a0 100644 --- a/tests/headers.at +++ b/tests/headers.at @@ -272,7 +272,7 @@ done AT_SKIP_IF_CANNOT_LINK_C_AND_CXX AT_COMPILE_CXX([parser], [[x[1-8].o -DCC_IS_CXX=$CC_IS_CXX main.cc]]) -AT_CHECK([./parser], [0], [[expout]]) +AT_PARSER_CHECK([./parser], [0], [[expout]]) m4_popdef([AT_TEST]) diff --git a/tests/local.at b/tests/local.at index e803e57f..a5dde80a 100644 --- a/tests/local.at +++ b/tests/local.at @@ -716,7 +716,7 @@ AT_COMPILE([c-only.o], [c-only.c]) AT_COMPILE_CXX([cxx-only.o], [cxx-only.cc]) AT_CHECK([$CXX $CXXFLAGS $CPPFLAGS $LDFLAGS c-only.o cxx-only.o -o c-and-cxx || exit 77], [ignore], [ignore]) -AT_CHECK([./c-and-cxx]) +AT_PARSER_CHECK([./c-and-cxx]) ]) diff --git a/tests/regression.at b/tests/regression.at index 6cf22685..03c4b808 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -1593,7 +1593,7 @@ main (void) ]]) AT_FULL_COMPILE([input]) -AT_CHECK([./input], 0, [[x: 1, y: 2 +AT_PARSER_CHECK([./input], 0, [[x: 1, y: 2 ]]) AT_BISON_OPTION_POPDEFS From ebbc76d0d7ff5f35af1a8d9b027037d8c70f0bbb Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 12 Nov 2012 09:33:26 +0100 Subject: [PATCH 4/5] tests: use valgrind where appropriate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reported by Théophile Ranquet. * cfg.mk (sc_at_parser_check): New. * tests/c++.at: Fix use of AT_CHECK vs. AT_PARSER_CHECK. --- cfg.mk | 12 ++++++++++++ tests/c++.at | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/cfg.mk b/cfg.mk index 9f11f377..7e46324f 100644 --- a/cfg.mk +++ b/cfg.mk @@ -61,6 +61,18 @@ update-copyright: update-b4-copyright update-package-copyright-year update-copyright-env = \ UPDATE_COPYRIGHT_FORCE=1 UPDATE_COPYRIGHT_USE_INTERVALS=1 +# At least for Mac OS X's grep, the order between . and [ in "[^.[]" +# matters: +# $ LC_ALL=fr_FR grep -nE '[^[.]' /dev/null +# $ LC_ALL=C grep -nE '[^[.]' /dev/null +# grep: invalid collating element or class +# $ LC_ALL=fr_FR grep -nE '[^.[]' /dev/null +# $ LC_ALL=C grep -nE '[^.[]' /dev/null +sc_at_parser_check: + @prohibit='AT_PARSER_CHECK\(\[+[^.[]|AT_CHECK\(\[+\./' \ + halt='use AT_PARSER_CHECK for and only for generated parsers' \ + $(_sc_search_regexp) + exclude = \ $(foreach a,$(1),$(eval $(subst $$,$$$$,exclude_file_name_regexp--sc_$(a)))) $(call exclude, \ diff --git a/tests/c++.at b/tests/c++.at index dba7a758..a5d83853 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -397,7 +397,7 @@ AT_PARSER_CHECK([[./input i]], [[2]], [[]], AT_PARSER_CHECK([[./input aaaap]]) AT_PARSER_CHECK([[./input --debug aaaap]], [[2]], [[]], [[stderr]]) -AT_PARSER_CHECK([[grep '^exception caught: printer$' stderr]], [], [ignore]) +AT_CHECK([[grep '^exception caught: printer$' stderr]], [], [ignore]) AT_PARSER_CHECK([[./input aaaae]], [[2]], [[]], [[exception caught: syntax error From bfdcc3a0b273c116e01d289ce52d400f22e4da14 Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Mon, 12 Nov 2012 09:39:41 +0100 Subject: [PATCH 5/5] maint: address syntax-check errors. * cfg.mk: Ignore the "error" call in tests/c++.at, it is not to be translated. * doc/bison.texi: Fix incorrect @pxref use. * po/POTFILES.in: Add missing file. * src/print_graph.c: Remove useless include. --- cfg.mk | 2 +- doc/bison.texi | 4 ++-- po/POTFILES.in | 1 + src/print_graph.c | 1 - 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cfg.mk b/cfg.mk index 7e46324f..3f244aab 100644 --- a/cfg.mk +++ b/cfg.mk @@ -88,5 +88,5 @@ $(call exclude, \ require_config_h_first=^(lib/yyerror|data/(glr|yacc))\.c$$ \ space_tab=^tests/(input|c\+\+)\.at$$ \ trailing_blank=^src/parse-gram.[ch]$$ \ - unmarked_diagnostics=^(djgpp/|doc/bison.texi$$) \ + unmarked_diagnostics=^(djgpp/|doc/bison.texi$$|tests/c\+\+\.at$$) \ ) diff --git a/doc/bison.texi b/doc/bison.texi index 8f98aa5e..7b900b27 100644 --- a/doc/bison.texi +++ b/doc/bison.texi @@ -8525,8 +8525,8 @@ a PDF or PNG file from it will take very long, and more often than not it will fail due to memory exhaustion). This option was rather designed for beginners, to help them understand LR parsers. -This file is generated when the @option{--graph} option is specified (see -@pxref{Invocation, , Invoking Bison}). Its name is made by removing +This file is generated when the @option{--graph} option is specified +(@pxref{Invocation, , Invoking Bison}). Its name is made by removing @samp{.tab.c} or @samp{.c} from the parser implementation file name, and adding @samp{.dot} instead. If the grammar file is @file{foo.y}, the Graphviz output file is called @file{foo.dot}. diff --git a/po/POTFILES.in b/po/POTFILES.in index 0908f506..ee34879a 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -9,6 +9,7 @@ src/main.c src/muscle-tab.c src/parse-gram.y src/print.c +src/print_graph.c src/reader.c src/reduce.c src/scan-code.l diff --git a/src/print_graph.c b/src/print_graph.c index d5ec5fb4..5ce0aa98 100644 --- a/src/print_graph.c +++ b/src/print_graph.c @@ -18,7 +18,6 @@ along with this program. If not, see . */ #include -#include #include "system.h" #include "LR0.h"