I have pushed these patches in maint. I will try to release a 3.0.1 soon. I'll first check if there are easy fixes, for other bug reports, that can be installed first.
Le 29 oct. 2013 à 16:11, Akim Demaille <[email protected]> a écrit : > Hi Paul, > > Ping! > > Le 25 oct. 2013 à 12:00, Akim Demaille <[email protected]> a écrit : > >> >> Le 23 oct. 2013 à 11:36, Akim Demaille <[email protected]> a écrit : >> >>> >>> Le 23 oct. 2013 à 11:08, Akim Demaille <[email protected]> a écrit : >>> >>>> What do you think about these two patches? >>> >>> Scratch that, I'll send updated patches a bit later. >> >> Hi Paul, >> >> Here is my revised proposal. I've pushed this in ad/maint. >> >> commit 40fce4507dc0fefdca79d932a87f0da0d7c32e82 >> Author: Akim Demaille <[email protected]> >> Date: Wed Oct 23 10:57:09 2013 +0200 >> >> skeletons: update the handling of compiler attributes >> >> * data/c.m4 (b4_attribute_define): Instead of defining __attribute__, >> define YY_ATTRIBUTE conditionally. >> (YY_ATTRIBUTE_PURE, YY_ATTRIBUTE_UNUSED, _Noreturn): New. >> Use them. >> * data/glr.c: Use them. >> >> diff --git a/data/c.m4 b/data/c.m4 >> index b1b4394..9b739bc 100644 >> --- a/data/c.m4 >> +++ b/data/c.m4 >> @@ -205,13 +205,32 @@ m4_define([b4_table_value_equals], >> >> # b4_attribute_define >> # ------------------- >> -# Provide portability for __attribute__. >> +# Provide portable compiler "attributes". >> m4_define([b4_attribute_define], >> -[#ifndef __attribute__ >> -/* This feature is available in gcc versions 2.5 and later. */ >> -# if (! defined __GNUC__ || __GNUC__ < 2 \ >> - || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)) >> -# define __attribute__(Spec) /* empty */ >> +[#ifndef YY_ATTRIBUTE >> +# if (defined __GNUC__ \ >> + && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ >> + || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C >> +# define YY_ATTRIBUTE(Spec) __attribute__(Spec) >> +# else >> +# define YY_ATTRIBUTE(Spec) /* empty */ >> +# endif >> +#endif >> + >> +#ifndef YY_ATTRIBUTE_PURE >> +# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) >> +#endif >> + >> +#ifndef YY_ATTRIBUTE_UNUSED >> +# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) >> +#endif >> + >> +#if !defined _Noreturn \ >> + && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) >> +# if defined _MSC_VER && 1200 <= _MSC_VER >> +# define _Noreturn __declspec (noreturn) >> +# else >> +# define _Noreturn YY_ATTRIBUTE ((__noreturn__)) >> # endif >> #endif >> >> @@ -783,7 +802,7 @@ m4_define([b4_yy_location_print_define], >> >> /* Print *YYLOCP on YYO. Private, do not rely on its existence. */ >> >> -__attribute__((__unused__)) >> +YY_ATTRIBUTE_UNUSED >> ]b4_function_define([yy_location_print_], >> [static unsigned], >> [[FILE *yyo], [yyo]], >> diff --git a/data/glr.c b/data/glr.c >> index 8ef3553..725453b 100644 >> --- a/data/glr.c >> +++ b/data/glr.c >> @@ -445,9 +445,9 @@ int yydebug; >> >> struct yyGLRStack; >> static void yypstack (struct yyGLRStack* yystackp, size_t yyk) >> - __attribute__ ((__unused__)); >> + YY_ATTRIBUTE_UNUSED; >> static void yypdumpstack (struct yyGLRStack* yystackp) >> - __attribute__ ((__unused__)); >> + YY_ATTRIBUTE_UNUSED; >> >> #else /* !]b4_api_PREFIX[DEBUG */ >> >> @@ -669,9 +669,7 @@ struct yyGLRStack { >> static void yyexpandGLRStack (yyGLRStack* yystackp); >> #endif >> >> -static void yyFail (yyGLRStack* yystackp]b4_pure_formals[, const char* >> yymsg) >> - __attribute__ ((__noreturn__)); >> -static void >> +static _Noreturn void >> yyFail (yyGLRStack* yystackp]b4_pure_formals[, const char* yymsg) >> { >> if (yymsg != YY_NULL) >> @@ -679,9 +677,7 @@ yyFail (yyGLRStack* yystackp]b4_pure_formals[, const >> char* yymsg) >> YYLONGJMP (yystackp->yyexception_buffer, 1); >> } >> >> -static void yyMemoryExhausted (yyGLRStack* yystackp) >> - __attribute__ ((__noreturn__)); >> -static void >> +static _Noreturn void >> yyMemoryExhausted (yyGLRStack* yystackp) >> { >> YYLONGJMP (yystackp->yyexception_buffer, 2); >> @@ -702,7 +698,7 @@ yytokenName (yySymbol yytoken) >> /** Fill in YYVSP[YYLOW1 .. YYLOW0-1] from the chain of states starting >> * at YYVSP[YYLOW0].yystate.yypred. Leaves YYVSP[YYLOW1].yystate.yypred >> * containing the pointer to the next state in the chain. */ >> -static void yyfillin (yyGLRStackItem *, int, int) __attribute__ >> ((__unused__)); >> +static void yyfillin (yyGLRStackItem *, int, int) YY_ATTRIBUTE_UNUSED; >> static void >> yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1) >> { >> @@ -729,7 +725,7 @@ yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1) >> * YYVSP[YYLOW1 .. *YYLOW-1] as in yyfillin and set *YYLOW = YYLOW1. >> * For convenience, always return YYLOW1. */ >> static inline int yyfill (yyGLRStackItem *, int *, int, yybool) >> - __attribute__ ((__unused__)); >> + YY_ATTRIBUTE_UNUSED; >> static inline int >> yyfill (yyGLRStackItem *yyvsp, int *yylow, int yylow1, yybool yynormal) >> { >> @@ -751,8 +747,7 @@ yyuserAction (yyRuleNum yyn, size_t yyrhslen, >> yyGLRStackItem* yyvsp, >> yyGLRStack* yystackp, >> YYSTYPE* yyvalp]b4_locuser_formals[) >> { >> - yybool yynormal __attribute__ ((__unused__)) = >> - (yystackp->yysplitPoint == YY_NULL); >> + yybool yynormal YY_ATTRIBUTE_UNUSED = (yystackp->yysplitPoint == YY_NULL); >> int yylow; >> ]b4_parse_param_use([yyvalp], [yylocp])dnl >> [ YYUSE (yyrhslen); >> >> commit 9292cfc09161fa6e96ff1a6e4fe53aa7d8697aa8 >> Author: Akim Demaille <[email protected]> >> Date: Wed Oct 23 10:57:51 2013 +0200 >> >> c++: use __attribute__((__pure__)) to avoid warnings >> >> Building C++ parsers with -Wsuggest-attribute=const and >> -Wsuggest-attribute=noreturn triggers warning in generated code. >> >> * data/lalr1.cc: Call b4_attribute_define. >> (debug_stream, debug_level): Flag as pure. >> * tests/headers.at (Several parsers): There are now more YY macros >> that "leak". >> >> diff --git a/data/lalr1.cc b/data/lalr1.cc >> index a378463..cb61ebb 100644 >> --- a/data/lalr1.cc >> +++ b/data/lalr1.cc >> @@ -157,6 +157,7 @@ m4_define([b4_shared_declarations], >> ]b4_bison_locations_if([[# include "location.hh"]])])[ >> ]b4_variant_if([b4_variant_includes])[ >> >> +]b4_attribute_define[ >> ]b4_YYDEBUG_define[ >> >> ]b4_namespace_open[ >> @@ -183,14 +184,14 @@ b4_location_define])])[ >> >> #if ]b4_api_PREFIX[DEBUG >> /// The current debugging stream. >> - std::ostream& debug_stream () const; >> + std::ostream& debug_stream () const YY_ATTRIBUTE_PURE; >> /// Set the current debugging stream. >> void set_debug_stream (std::ostream &); >> >> /// Type for debugging levels. >> typedef int debug_level_type; >> /// The current debugging level. >> - debug_level_type debug_level () const; >> + debug_level_type debug_level () const YY_ATTRIBUTE_PURE; >> /// Set the current debugging level. >> void set_debug_level (debug_level_type l); >> #endif >> diff --git a/tests/headers.at b/tests/headers.at >> index 0ad7ef3..9b71c03 100644 >> --- a/tests/headers.at >> +++ b/tests/headers.at >> @@ -223,7 +223,11 @@ AT_CHECK([[$PERL -n -0777 -e ' >> s{/\*.*?\*/}{}gs; >> s{//.*}{}g; >> s{\b(YYChar >> - |YYPUSH_MORE(_DEFINED)? >> + |YYPUSH_MORE(?:_DEFINED)? >> + |YYUSE >> + |YY_ATTRIBUTE(?:_PURE|_UNUSED)? >> + |YY_IGNORE_MAYBE_UNINITIALIZED_(?:BEGIN|END) >> + |YY_INITIAL_VALUE >> |YY_\w+_INCLUDED >> |YY_NULL >> |(defined|if)\ YYDEBUG >> >> > >
