Re: [Bison-Announce] Bison 3.4.91 released [beta]

Frank Heckenbach <[email protected]>
Newsgroups gmane.comp.parsers.bison.bugs
Message-ID <E1iavgY-0001rA-Es@goedel>
Hi,

I did some more tests and got some new compiler warnings:

% cat test.yy
%skeleton "lalr1.cc"
%code { int yylex (int *); }
%%
a:
  "t1"
| "t2"
| "t3"
| "t4"
| "t5"
| "t6"
| "t7"
| "t8"
| "t9"
| "t10"
| "t11"
| "t12"
| "t13"
| "t14"
| "t15"
| "t16"
| "t17"
| "t18"
| "t19"
| "t20"
| "t21"
| "t22"
| "t23"
| "t24"
| "t25"
| "t26"
| "t27"
| "t28"
| "t29"
| "t30"
| "t31"
| "t32"
| "t33"
| "t34"
| "t35"
| "t36"
| "t37"
| "t38"
| "t39"
| "t40"
| "t41"
| "t42"
| "t43"
| "t44"
| "t45"
| "t46"
| "t47"
| "t48"
| "t49"
| "t50"
| "t51"
| "t52"
| "t53"
| "t54"
| "t55"
| "t56"
| "t57"
| "t58"
| "t59"
| "t60"
| "t61"
| "t62"
| "t63"
| "t64"
| "t65"
| "t66"
| "t67"
| "t68"
| "t69"
| "t70"
| "t71"
| "t72"
| "t73"
| "t74"
| "t75"
| "t76"
| "t77"
| "t78"
| "t79"
| "t80"
| "t81"
| "t82"
| "t83"
| "t84"
| "t85"
| "t86"
| "t87"
| "t88"
| "t89"
| "t90"
| "t91"
| "t92"
| "t93"
| "t94"
| "t95"
| "t96"
| "t97"
| "t98"
| "t99"
| "t100"
| "t101"
| "t102"
| "t103"
| "t104"
| "t105"
| "t106"
| "t107"
| "t108"
| "t109"
| "t110"
| "t111"
| "t112"
| "t113"
| "t114"
| "t115"
| "t116"
| "t117"
| "t118"
| "t119"
| "t120"
| "t121"
| "t122"
| "t123"
| "t124"
| "t125"
| "t126"
;
% bison -o test.cc test.yy
% g++-7 -Wextra -Wuseless-cast -c test.cc
test.cc: In member function 'yy::parser::symbol_number_type yy::parser::by_state::type_get() const':
test.cc:872:15: warning: comparison is always false due to limited range of data type [-Wtype-limits]
     if (state == empty_state)
         ~~~~~~^~~~~~~~~~~~~~
test.cc: In static member function 'static yy::parser::token_number_type yy::parser::yytranslate_(int)':
test.cc:1620:28: warning: useless cast to type 'int' [-Wuseless-cast]
     if (static_cast<int> (t) <= yyeof_)
                            ^
test.cc:1622:33: warning: useless cast to type 'int' [-Wuseless-cast]
     else if (static_cast<int> (t) <= user_token_number_max_)
                                 ^

The latter warnings could perhaps be silenced by replacing
"static_cast<int> (t)" with "int { t }", but I don't know enough
about the context to tell if that's correct and safe.

The first warning vanishes with g++-9, but it might be a real issue.
Though C[++] type promotion rules are still a horror to me, the
following test program seems to do what Bison does and yields "0"
(either compiler version, either compiled as C or C++) which
(assuming that's correct for C[++]) would indicate that Bison's
comparison is wrong.

#include <stdio.h>

int main ()
{
  enum { empty_state = -1 };
  unsigned char c = empty_state;
  printf ("%i\n", c == empty_state);
}

Regards,
Frank
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.