diff options
author | Akim Demaille <akim@lrde.epita.fr> | 2013-04-19 17:13:07 +0200 |
---|---|---|
committer | Akim Demaille <akim@lrde.epita.fr> | 2013-04-19 17:13:07 +0200 |
commit | 7ba01e111c878291d8677db124eb4d7aef7c9541 (patch) | |
tree | c8d8468add55e6182b0dda3beb7594beab7dd943 | |
parent | 6ce4b4ff1b761a0408cf94abb308fac9b55edd3d (diff) | |
download | bison-7ba01e111c878291d8677db124eb4d7aef7c9541.tar.gz |
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.
-rw-r--r-- | THANKS | 1 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | data/location.cc | 19 | ||||
-rw-r--r-- | tests/actions.at | 10 |
4 files changed, 18 insertions, 14 deletions
@@ -38,6 +38,7 @@ Derek M. Jones derek@knosof.co.uk Di-an Jan dianj@freeshell.org Dick Streefland dick.streefland@altium.nl Didier Godefroy dg@ulysium.net +Efi Fogel efifogel@gmail.com Enrico Scholz enrico.scholz@informatik.tu-chemnitz.de Eric Blake ebb9@byu.net Evgeny Stambulchik fnevgeny@plasma-gate.weizmann.ac.il diff --git a/configure.ac b/configure.ac index e6ef8baf..df5670cd 100644 --- a/configure.ac +++ b/configure.ac @@ -91,7 +91,7 @@ if test "$enable_gcc_warnings" = yes; then # -fno-color-diagnostics: Clang's use of colors in the error # messages is confusing the tests looking at the compiler's output # (e.g., synclines.at). - warn_tests='-Wundef -pedantic -fno-color-diagnostics' + warn_tests='-Wundef -pedantic -Wsign-compare -fno-color-diagnostics' AC_LANG_PUSH([C]) # Clang supports many of GCC's -W options, but only issues warnings diff --git a/data/location.cc b/data/location.cc index 309b9c0f..9a60f250 100644 --- a/data/location.cc +++ b/data/location.cc @@ -55,20 +55,14 @@ m4_define([b4_position_define], if (count) { column = ]b4_location_initial_column[u; - line = - 0 < count || -count < line - ? line + count - : ]b4_location_initial_line[; + line = add_ (line, count, ]b4_location_initial_line[); } } /// (column related) Advance to the COUNT next columns. void columns (int count = 1) { - column = - 0 < count || -count < column - ? column + count - : ]b4_location_initial_column[; + column = add_ (column, count, ]b4_location_initial_column[); } /** \} */ @@ -78,6 +72,15 @@ m4_define([b4_position_define], unsigned int line; /// Current column number. 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. diff --git a/tests/actions.at b/tests/actions.at index 88aad258..6c1ecbc1 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -605,11 +605,11 @@ static { 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. */ ]AT_LOC_FIRST_LINE[ = ]AT_LOC_FIRST_COLUMN[ = 10 * c; ]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]) fprintf (stderr, "sending: '%c'", source[c]); else @@ -848,13 +848,13 @@ AT_CLEANUP 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"], [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], [with union]) +AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser], [ with union]) |