Merge remote-tracking branch 'origin/maint'

* origin/maint:
  headers: move CPP guards into YY_*_INCLUDED to avoid collisions
  minor changes.

Conflicts:
	doc/bison.texi
	tests/headers.at
This commit is contained in:
Akim Demaille
2012-10-01 14:00:23 +02:00
4 changed files with 45 additions and 13 deletions

13
NEWS
View File

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

View File

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

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

View 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