[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 5/5] bison: pacify Sun C 5.12
From: |
Akim Demaille |
Subject: |
Re: [PATCH 5/5] bison: pacify Sun C 5.12 |
Date: |
Fri, 25 Oct 2013 12:00:52 +0200 |
Le 23 oct. 2013 à 11:36, Akim Demaille <address@hidden> a écrit :
>
> Le 23 oct. 2013 à 11:08, Akim Demaille <address@hidden> 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 <address@hidden>
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 <address@hidden>
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
- [PATCH 1/5] maint: git now ignores .log and .trs files, (continued)
- [PATCH 1/5] maint: git now ignores .log and .trs files, Paul Eggert, 2013/10/21
- [PATCH 2/5] maint: mention help2man, texinfo, apt-get, Paul Eggert, 2013/10/21
- [PATCH 3/5] build: examples/calc++/calc++ requires flex, Paul Eggert, 2013/10/21
- [PATCH 4/5] maint: git now ignores rpcalc, Paul Eggert, 2013/10/21
- [PATCH 5/5] bison: pacify Sun C 5.12, Paul Eggert, 2013/10/21