tests: enable -Wsign-compare and fix corresponding warnings

-Wsign-compare was disabled for bison's own code, following gnulib's
approach.  However, the generated parsers should not trigger such
warnings.

Reported by Efi Fogel.
http://lists.gnu.org/archive/html/help-bison/2013-04/msg00018.html

See also http://stackoverflow.com/questions/16101062 for the weird
"-(unsigned)i" piece of code.

* configure.ac (warn_tests): Enable -Wsign-compare.
* data/location.cc (position::add_): New.
(position::lines, position::columns): Use it.
* tests/actions.at (AT_CHECK_PRINTER_AND_DESTRUCTOR): Fix signedness issues.
This commit is contained in:
Akim Demaille
2013-04-19 17:13:07 +02:00
parent 6ce4b4ff1b
commit 7ba01e111c
4 changed files with 18 additions and 14 deletions

1
THANKS
View File

@@ -38,6 +38,7 @@ Derek M. Jones derek@knosof.co.uk
Di-an Jan dianj@freeshell.org Di-an Jan dianj@freeshell.org
Dick Streefland dick.streefland@altium.nl Dick Streefland dick.streefland@altium.nl
Didier Godefroy dg@ulysium.net Didier Godefroy dg@ulysium.net
Efi Fogel efifogel@gmail.com
Enrico Scholz enrico.scholz@informatik.tu-chemnitz.de Enrico Scholz enrico.scholz@informatik.tu-chemnitz.de
Eric Blake ebb9@byu.net Eric Blake ebb9@byu.net
Evgeny Stambulchik fnevgeny@plasma-gate.weizmann.ac.il Evgeny Stambulchik fnevgeny@plasma-gate.weizmann.ac.il

View File

@@ -91,7 +91,7 @@ if test "$enable_gcc_warnings" = yes; then
# -fno-color-diagnostics: Clang's use of colors in the error # -fno-color-diagnostics: Clang's use of colors in the error
# messages is confusing the tests looking at the compiler's output # messages is confusing the tests looking at the compiler's output
# (e.g., synclines.at). # (e.g., synclines.at).
warn_tests='-Wundef -pedantic -fno-color-diagnostics' warn_tests='-Wundef -pedantic -Wsign-compare -fno-color-diagnostics'
AC_LANG_PUSH([C]) AC_LANG_PUSH([C])
# Clang supports many of GCC's -W options, but only issues warnings # Clang supports many of GCC's -W options, but only issues warnings

View File

@@ -55,20 +55,14 @@ m4_define([b4_position_define],
if (count) if (count)
{ {
column = ]b4_location_initial_column[u; column = ]b4_location_initial_column[u;
line = line = add_ (line, count, ]b4_location_initial_line[);
0 < count || -count < line
? line + count
: ]b4_location_initial_line[;
} }
} }
/// (column related) Advance to the COUNT next columns. /// (column related) Advance to the COUNT next columns.
void columns (int count = 1) void columns (int count = 1)
{ {
column = column = add_ (column, count, ]b4_location_initial_column[);
0 < count || -count < column
? column + count
: ]b4_location_initial_column[;
} }
/** \} */ /** \} */
@@ -78,6 +72,15 @@ m4_define([b4_position_define],
unsigned int line; unsigned int line;
/// Current column number. /// Current column number.
unsigned int column; unsigned int column;
private:
/// Compute max(min, lhs+rhs) (provided min <= lhs).
static unsigned int add_ (unsigned int lhs, int rhs, unsigned int min)
{
return (0 < rhs || -static_cast<unsigned int>(rhs) < lhs
? rhs + lhs
: min);
}
}; };
/// Add and assign a position. /// Add and assign a position.

View File

@@ -605,11 +605,11 @@ static
{ {
static unsigned int counter = 0; static unsigned int counter = 0;
int c = ]AT_VAL[]m4_ifval([$6], [.ival])[ = counter++; unsigned int c = ]AT_VAL[]m4_ifval([$6], [.ival])[ = counter++;
/* As in BASIC, line numbers go from 10 to 10. */ /* As in BASIC, line numbers go from 10 to 10. */
]AT_LOC_FIRST_LINE[ = ]AT_LOC_FIRST_COLUMN[ = 10 * c; ]AT_LOC_FIRST_LINE[ = ]AT_LOC_FIRST_COLUMN[ = 10 * c;
]AT_LOC_LAST_LINE[ = ]AT_LOC_LAST_COLUMN[ = ]AT_LOC_FIRST_LINE[ + 9; ]AT_LOC_LAST_LINE[ = ]AT_LOC_LAST_COLUMN[ = ]AT_LOC_FIRST_LINE[ + 9;
assert (0 <= c && c <= strlen (source)); assert (c <= strlen (source));
if (source[c]) if (source[c])
fprintf (stderr, "sending: '%c'", source[c]); fprintf (stderr, "sending: '%c'", source[c]);
else else
@@ -848,13 +848,13 @@ AT_CLEANUP
AT_CHECK_PRINTER_AND_DESTRUCTOR([]) AT_CHECK_PRINTER_AND_DESTRUCTOR([])
AT_CHECK_PRINTER_AND_DESTRUCTOR([], [with union]) AT_CHECK_PRINTER_AND_DESTRUCTOR([], [ with union])
AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"]) AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"])
AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"], [with union]) AT_CHECK_PRINTER_AND_DESTRUCTOR([%defines %skeleton "lalr1.cc"], [ with union])
AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser]) AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser])
AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [with union]) AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [ with union])