]> git.saurik.com Git - bison.git/commitdiff
Merge remote-tracking branch 'origin/maint'
authorAkim Demaille <akim@lrde.epita.fr>
Mon, 1 Oct 2012 12:00:23 +0000 (14:00 +0200)
committerAkim Demaille <akim@lrde.epita.fr>
Mon, 1 Oct 2012 12:10:33 +0000 (14:10 +0200)
* origin/maint:
  headers: move CPP guards into YY_*_INCLUDED to avoid collisions
  minor changes.

Conflicts:
doc/bison.texi
tests/headers.at

NEWS
data/c.m4
doc/bison.texi
tests/headers.at

diff --git a/NEWS b/NEWS
index ee1b0957bfeb02aa0339574a5bcdace6e85bddbc..a5c7a99dff06984aef67a8a624702428a6547729 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -250,7 +250,7 @@ GNU Bison NEWS
   Incorrect definitions of YY_, issued by yacc.c when no parser header is
   generated, are removed.
 
-** Changes in the format of errors and exceptions output
+** Changes in the format of error messages
 
   This used to be the format of many error reports:
 
@@ -262,6 +262,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
index 84713884a589ea9ee6fa8bb15e100ff8ff36f8ca..3bc2c215df60c5373cc8bab1a5b039cb26af1f0e 100644 (file)
--- 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)
index 805ab9c33a155cd7893e1dc451864241c8bf710f..0e3a2500eb860a45b21c2eb0dcb8ef55723d34e3 100644 (file)
@@ -5204,6 +5204,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}.
+
+@cindex Header guard
+The generated header is protected against multiple inclusions with a C
+preprocessor guard: @samp{YY_@var{PREFIX}_@var{FILE}_INCLUDED}, where
+@var{PREFIX} 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.
+@example
+#ifndef YY_CALC_LIB_PARSE_H_INCLUDED
+# define YY_CALC_LIB_PARSE_H_INCLUDED
+...
+#endif /* ! YY_CALC_LIB_PARSE_H_INCLUDED */
+@end example
 @end deffn
 
 @deffn {Directive} %defines @var{defines-file}
@@ -8824,8 +8841,8 @@ Prologue}).
 If the @code{%define} variable @code{api.prefix} is used (@pxref{Multiple
 Parsers, ,Multiple Parsers in the Same Program}), for instance @samp{%define
 api.prefix x}, then if @code{CDEBUG} is defined, its value controls the
-tracing feature (enabled iff nonzero); otherwise tracing is enabled iff
-@code{YYDEBUG} is nonzero.
+tracing feature (enabled if and only if nonzero); otherwise tracing is
+enabled if and only if @code{YYDEBUG} is nonzero.
 
 @item the option @option{-t} (POSIX Yacc compliant)
 @itemx the option @option{--debug} (Bison extension)
@@ -12449,10 +12466,11 @@ London, Department of Computer Science, TR-00-12 (December 2000).
 @c LocalWords: toString deftypeivar deftypeivarx deftypeop YYParser strictfp
 @c LocalWords: superclasses boolean getErrorVerbose setErrorVerbose deftypecv
 @c LocalWords: getDebugStream setDebugStream getDebugLevel setDebugLevel url
-@c LocalWords: bisonVersion deftypecvx bisonSkeleton getStartPos getEndPos
+@c LocalWords: bisonVersion deftypecvx bisonSkeleton getStartPos getEndPos uint
 @c LocalWords: getLVal defvar deftypefn deftypefnx gotos msgfmt Corbett LALR's
-@c LocalWords: subdirectory Solaris nonassociativity perror schemas Malloy
-@c LocalWords: Scannerless ispell american
+@c LocalWords: subdirectory Solaris nonassociativity perror schemas Malloy ints
+@c LocalWords: Scannerless ispell american ChangeLog smallexample CSTYPE CLTYPE
+@c LocalWords: clval CDEBUG cdebug deftypeopx yyterminate
 
 @c Local Variables:
 @c ispell-dictionary: "american"
index 22f6000a88e5b8b72bfc9ec8348bbc3e857f6579..df0c0580563a0ed11274f14f5157ecb6b85c12f3 100644 (file)
@@ -126,8 +126,8 @@ AT_SETUP([Several parsers])
 
 # AT_TEST([PREFIX], [DIRECTIVES])
 # -------------------------------
-# Generate and compile to *.o.  Make sure there is no YY* nor yy* in
-# the header (but YYDEBUG).
+# Generate and compile to *.o.  Make sure there is no (allowed) YY*
+# nor yy* identifiers in the header.
 m4_pushdef([AT_TEST],
 [AT_BISON_OPTION_PUSHDEFS([%define api.prefix "$1_" $2])
 AT_DATA_GRAMMAR([$1.AT_SKEL_CC_IF([yy], [y])],
@@ -161,21 +161,24 @@ exp:
 ]])
 
 AT_BISON_CHECK([-d -o AT_SKEL_CC_IF([$1.cc $1.yy], [$1.c $1.y])])
+
+# Check there is no 'yy' left.
 # C++ output relies on namespaces and still uses yy a lot.
 AT_SKEL_CC_IF([],
   [AT_CHECK([$EGREP yy $1.h], [1])])
 
-# Ignore comments. Ignore YYPUSH_MORE(_DEFINED)? (whose definition
-# is constant).
+# Check there is not 'YY' left.
+# Ignore comments, YYPUSH_MORE(_DEFINED)?  (constant definition),
+# YY_\w+_INCLUDED (header guards).
 #
 # YYDEBUG (not renamed) can be read, but not changed.
 AT_CHECK([[$PERL -0777 -e 's{/\*.*?\*/}{}sg;s,//.*,,;' \
             ]$1.AT_SKEL_CC_IF([hh], [h])[ |
          grep 'YY' |
-     $EGREP -wv 'YYPUSH_MORE(_DEFINED)?|(defined|if) YYDEBUG']],
+     $EGREP -wv 'YY(PUSH_MORE(_DEFINED)?|_[0-9A-Z_]+_INCLUDED)|(defined|if) YYDEBUG']],
          [1])
-AT_LANG_COMPILE([$1.o])
 
+AT_LANG_COMPILE([$1.o])
 AT_CHECK([[echo "$1" >>expout]])
 
 AT_BISON_OPTION_POPDEFS