> Le 20 nov. 2018 à 23:18, Akim Demaille <a...@lrde.epita.fr> a écrit : > > I don’t have any problems with having two pairs of parens, after all we’ve > done that forever in the case of assignments in if’s etc. That’s a clear way > to tell the others, including the compiler, that something fishy is > intentional (until ‘sic’ becomes a keyword). > > The problem here is that it does not work, although it should.
This appears to be the proper fix. commit cc050fd3218c4ee467dfe6c234867d84bd3e7119 Author: Akim Demaille <akim.demai...@gmail.com> Date: Thu Nov 22 18:03:12 2018 +0100 warning: avoid warnings about unreachable code Reported by Uxio Prego. https://lists.gnu.org/archive/html/help-bison/2018-11/msg00031.html We also need to move the unreachable 'goto' to a reachable place, otherwise clang complains about the code being unreachable anyway. See also https://bugs.llvm.org/show_bug.cgi?id=39736. Interestingly, we don't have to apply that trick to `#define YYCDEBUG if (false) std::cerr`, clang does not warn when the code comes from macro expansion. * configure.ac: Use -Wunreachable-code when supported. * data/lalr1.cc, data/yacc.c: Pacify clang's warning about `if (0)` by using a macro. Another possibility was to move this statement to a reachable place. * tests/actions.at, tests/c++.at: Avoid generating unreachable code. diff --git a/configure.ac b/configure.ac index 3d55f08c..959fc968 100644 --- a/configure.ac +++ b/configure.ac @@ -113,6 +113,7 @@ if test "$enable_gcc_warnings" = yes; then -fno-color-diagnostics -Wno-keyword-macro' + AC_LANG_PUSH([C]) # Clang supports many of GCC's -W options, but only issues warnings # on the ones it does not recognize. In that case, gl_WARN_ADD @@ -126,6 +127,11 @@ if test "$enable_gcc_warnings" = yes; then # CFLAGS, and restore CFLAGS after the tests. save_CFLAGS=$CFLAGS gl_WARN_ADD([-Werror=unknown-warning-option], [CFLAGS]) + # Accept this warning only if it is not too touchy (e.g., clang 3.3 + # and 3.4). + gl_WARN_ADD([-Wunreachable-code], [WARN_CFLAGS], + [AC_LANG_PROGRAM([], + [[if (sizeof (long) < sizeof (int)) return 1;]])]) for i in $warn_common $warn_c; do gl_WARN_ADD([$i], [WARN_CFLAGS]) @@ -147,6 +153,7 @@ if test "$enable_gcc_warnings" = yes; then CFLAGS=$save_CFLAGS AC_LANG_POP([C]) + AC_LANG_PUSH([C++]) save_CXXFLAGS=$CXXFLAGS gl_WARN_ADD([-Werror=unknown-warning-option], [CXXFLAGS]) @@ -154,6 +161,11 @@ if test "$enable_gcc_warnings" = yes; then do gl_WARN_ADD([$i], [WARN_CXXFLAGS]) done + # Accept this warning only if it is not too touchy (e.g., clang 3.3 + # and 3.4). + gl_WARN_ADD([-Wunreachable-code], [WARN_CXXFLAGS], + [AC_LANG_PROGRAM([], + [[if (sizeof (long) < sizeof (int)) return 1;]])]) gl_WARN_ADD([-Wzero-as-null-pointer-constant], [WARN_CXXFLAGS], [AC_LANG_PROGRAM([], [nullptr])]) gl_WARN_ADD([-Werror], [WERROR_CXXFLAGS]) diff --git a/data/lalr1.cc b/data/lalr1.cc index 8486f9e8..78f3d1e0 100644 --- a/data/lalr1.cc +++ b/data/lalr1.cc @@ -971,11 +971,11 @@ b4_dollar_popdef])[]dnl | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ + /* Pacify compilers when the user code never invokes YYERROR and + the label yyerrorlab therefore never appears in user code. */ if (false) - goto yyerrorlab; + YYERROR; + /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ yypop_ (yylen); diff --git a/data/yacc.c b/data/yacc.c index 3f2883c6..ee0acd5b 100644 --- a/data/yacc.c +++ b/data/yacc.c @@ -1777,11 +1777,10 @@ yyerrlab: | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ yyerrorlab: - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ + /* Pacify compilers when the user code never invokes YYERROR and the + label yyerrorlab therefore never appears in user code. */ if (0) - goto yyerrorlab; + YYERROR; /* Do not reclaim the symbols of the rule whose action triggered this YYERROR. */ diff --git a/examples/calc++/local.mk b/examples/calc++/local.mk index 059f2b05..8de5bf4d 100644 --- a/examples/calc++/local.mk +++ b/examples/calc++/local.mk @@ -20,7 +20,7 @@ # Don't depend on $(BISON) otherwise we would rebuild these files # in srcdir, including during distcheck, which is forbidden. -%D%/parser.stamp: $(BISON_IN) +%D%/parser.stamp: $(BISON_IN) $(dist_pkgdata_DATA) SUFFIXES += .yy .stamp .yy.stamp: $(AM_V_YACC)rm -f $@ diff --git a/tests/actions.at b/tests/actions.at index deeed15d..7d692cd5 100644 --- a/tests/actions.at +++ b/tests/actions.at @@ -519,6 +519,8 @@ AT_DATA_GRAMMAR([[input.y]], #define RANGE(Location) ]AT_LALR1_CC_IF([(Location).begin.line, (Location).end.line], [(Location).first_line, (Location).last_line])[ +#define USE(SYM) + /* Display the symbol type Symbol. */ #define V(Symbol, Value, Location, Sep) \ fprintf (stderr, #Symbol " (%d@%d-%d)%s", Value, RANGE(Location), Sep) @@ -610,8 +612,8 @@ input: ; check-spontaneous-errors: - raise { abort(); $$ = $1; } -| '(' raise ')' { abort(); $$ = $2; } + raise { abort(); USE(($$, $1)); } +| '(' raise ')' { abort(); USE(($$, $2)); } | error { $$ = 5; diff --git a/tests/c++.at b/tests/c++.at index 81c61863..2d5a4ac2 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -435,8 +435,6 @@ namespace yy return parser::token::TEXT;]])[ } } - - abort (); } } _______________________________________________ help-bison@gnu.org https://lists.gnu.org/mailman/listinfo/help-bison