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 > >
