bug-bison
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Conflicts with header guards


From: Akim Demaille
Subject: Re: Conflicts with header guards
Date: Thu, 27 Sep 2012 09:53:44 +0200

Le 26 sept. 2012 à 17:19, Paul Eggert a écrit :

> On 09/25/2012 01:15 AM, Akim Demaille wrote:
>> Unless I have misunderstood your suggestion.
> 
> No, you got it right, and clearly I got it wrong :-).  Thanks.


That's not usual :)

So here is my proposal, taking the _INCLUDED route.

commit 0c88683801c1ba58727ffcf91fe31dc841a6d344
Author: Akim Demaille <address@hidden>
Date:   Thu Sep 27 09:43:49 2012 +0200

    headers: move CPP guards into YY_*_INCLUDED to avoid collisions
    
    See <http://lists.gnu.org/archive/html/bug-bison/2012-09/msg00016.html>.
    
    * data/c.m4 (b4_cpp_guard): Prepend YY_ and append _INCLUDED.
    * tests/headers.at: Adjust.
    * NEWS, doc/bison.texi: Document.

diff --git a/NEWS b/NEWS
index e8b2d95..ad5f738 100644
--- a/NEWS
+++ b/NEWS
@@ -26,6 +26,17 @@ GNU Bison NEWS
     foo.y:5.10-25: result type clash on merge function 'merge': <t3> != <t2>
     foo.y:4.13-27:     previous declaration
 
+** Header guards (yacc.c, glr.c, glr.cc)
+
+  In order to avoid collisions, the header guards are now
+  YY_<PREFIX>_<FILE>_INCLUDED, instead of merely <PREFIX>_<FILE>.
+  For instance the header generated from
+
+    %define api.prefix "calc"
+    %defines "lib/parse.h"
+
+  will use YY_CALC_LIB_PARSE_H_INCLUDED as guard.
+
 * Noteworthy changes in release 2.6.2 (2012-08-03) [stable]
 
 ** Bug fixes
diff --git a/data/c.m4 b/data/c.m4
index ccb4969..fd2203e 100644
--- a/data/c.m4
+++ b/data/c.m4
@@ -30,7 +30,7 @@ m4_define([b4_tocpp],
 # ------------------
 # A valid C macro name to use as a CPP header guard for FILE.
 m4_define([b4_cpp_guard],
-[b4_tocpp(m4_defn([b4_prefix])/[$1])])
+[[YY_]b4_tocpp(m4_defn([b4_prefix])/[$1])[_INCLUDED]])
 
 
 # b4_cpp_guard_open(FILE)
diff --git a/doc/bison.texi b/doc/bison.texi
index b8a1aa6..6983611 100644
--- a/doc/bison.texi
+++ b/doc/bison.texi
@@ -5124,6 +5124,23 @@ Values, ,Semantic Values of Tokens}.
 If you have declared @code{%code requires} or @code{%code provides}, the output
 header also contains their code.
 @xref{%code Summary}.
+
address@hidden Header guard
+The generated header is protected against multiple inclusions with a C
+preprocessor guard: @address@hidden@var{FILE}_INCLUDED}, where
address@hidden and @var{FILE} are the prefix (@pxref{Multiple Parsers,
+,Multiple Parsers in the Same Program}) and generated file name turned
+uppercase, with each series of non alphanumerical characters converted to a
+single underscore.
+
+For instance with @samp{%define api.prefix "calc"} and @samp{%defines
+"lib/parse.h"}, the header will be guarded as follows.
address@hidden
+#ifndef YY_CALC_LIB_PARSE_H_INCLUDED
+# define YY_CALC_LIB_PARSE_H_INCLUDED
+...
+#endif /* ! YY_CALC_LIB_PARSE_H_INCLUDED */
address@hidden example
 @end deffn
 
 @deffn {Directive} %defines @var{defines-file}
diff --git a/tests/headers.at b/tests/headers.at
index aea0bc9..0524340 100644
--- a/tests/headers.at
+++ b/tests/headers.at
@@ -167,13 +167,14 @@ AT_BISON_CHECK([-d -o AT_SKEL_CC_IF([$1.cc $1.yy], [$1.c 
$1.y])])
 AT_SKEL_CC_IF([],
   [AT_CHECK([$EGREP yy $1.h], [1])])
 
-# Ignore comments. Ignore YYPARSE_PARAM (obsolete) and
-# YYPUSH_MORE(_DEFINED)? (whose definition is constant).
+# Check there is not 'YY' left.
+# Ignore comments, YYPARSE_PARAM (obsolete), YYPUSH_MORE(_DEFINED)?
+# (constant definition), YY_\w+_INCLUDED (header guards).
 #
 # YYDEBUG (not renamed) can be read, but not changed.
 AT_CHECK([[sed -ne 's,/\*[^*]*\*/,,g;s,//.*,,' \
                 -e '/YY/p' ]$1.AT_SKEL_CC_IF([hh], [h])[ |
-     $EGREP -wv 'YY(PARSE_PARAM|PUSH_MORE(_DEFINED)?)|(defined|if) YYDEBUG']],
+     $EGREP -wv 
'YY(PARSE_PARAM|PUSH_MORE(_DEFINED)?|_[0-9A-Z_]+_INCLUDED)|(defined|if) 
YYDEBUG']],
          [1])
 
 AT_LANG_COMPILE([$1.o])




reply via email to

[Prev in Thread] Current Thread [Next in Thread]