Merge remote-tracking branch 'origin/maint'

* origin/maint:
  maint: address syntax-check errors.
  tests: use valgrind where appropriate
  tests: use valgrind where appropriate
  tests: don't expect $EGREP to support -w
  tests: more possible error compiler messages for "#error"

Conflicts:
	cfg.mk
	tests/headers.at
This commit is contained in:
Akim Demaille
2012-11-12 09:45:30 +01:00
11 changed files with 102 additions and 48 deletions

1
THANKS
View File

@@ -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

14
cfg.mk
View File

@@ -55,6 +55,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, \
@@ -70,5 +82,5 @@ $(call exclude, \
prohibit_strcmp=^doc/bison\.texi$$ \
require_config_h_first=^(lib/yyerror|data/(glr|yacc))\.c$$ \
space_tab=^tests/(input|c\+\+)\.at$$ \
unmarked_diagnostics=^(djgpp/|doc/bison.texi$$) \
unmarked_diagnostics=^(djgpp/|doc/bison.texi$$|tests/c\+\+\.at$$) \
)

View File

@@ -8856,8 +8856,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}.

View File

@@ -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

View File

@@ -18,7 +18,6 @@
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include <config.h>
#include <quotearg.h>
#include "system.h"
#include "LR0.h"

View File

@@ -734,7 +734,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

View File

@@ -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: warning: 1 shift/reduce conflict [-Wconflicts-sr]
]])
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
@@ -330,10 +336,13 @@ glr-regr3.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr]
]])
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

View File

@@ -163,22 +163,6 @@ exp:
AT_BISON_CHECK([-d -o $1.AT_SKEL_CC_IF([cc], [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, YYPUSH_MORE(_DEFINED)? (constant definition),
# YY_\w+_INCLUDED (header guards).
#
# YYDEBUG (not renamed) can be read, but not changed.
AT_CHECK([[$PERL -0777 -e 's{/\*.*?\*/}{}sg;s,//.*,,;' \
]$1.AT_SKEL_CC_IF([hh], [h])[ |
grep 'YY' |
$EGREP -wv 'YY(PUSH_MORE(_DEFINED)?|_[0-9A-Z_]+_INCLUDED)|(defined|if) YYDEBUG']],
[1])
AT_LANG_COMPILE([$1.o])
AT_CHECK([[echo "$1" >>expout]])
@@ -241,6 +225,35 @@ 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, 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(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
@@ -258,7 +271,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])

View File

@@ -697,7 +697,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])
])

View File

@@ -1638,7 +1638,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

View File

@@ -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])