mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-10 04:43:03 +00:00
Modern C++ (i.e., C++11 and later) introduced "move only" types: types such as std::unique_ptr<T> that can never be duplicated. They must never be copied (by assignments and constructors), they must be "moved". The implementation of lalr1.cc used to copy symbols (including their semantic values). This commit ensures that values are only moved in modern C++, yet remain compatible with C++98/C++03. Suggested by Frank Heckenbach, who provided a full implementation on top of C++17's std::variant. See http://lists.gnu.org/archive/html/bug-bison/2018-03/msg00002.html, and https://lists.gnu.org/archive/html/bison-patches/2018-04/msg00002.html. Symbols (terminal/non terminal) are handled by several functions that used to take const-refs, which resulted eventually in a copy pushed on the stack. With modern C++ (C++11 and later) the callers must use std::move, and the callees must take their arguments as rvalue refs (foo&&). In order to avoid duplicating these functions to support both legacy C++ and modern C++, let's introduce macros (YY_MOVE, YY_RVREF, etc.) that rely on copy-semantics for C++98/03, and move-semantics for modern C++. That's easy for inner types, when the parser's functions pass arguments to each other. Functions facing the user (make_NUMBER, make_STRING, etc.) should support both rvalue-refs (for instance to support move-only types: make_INT (std::make_unique<int> (1))), and lvalue-refs (so that we can pass a variable: make_INT (my_int)). To avoid the multiplication of the signatures (there is also the location), let's take the argument by value. See: https://lists.gnu.org/archive/html/bison-patches/2018-09/msg00024.html. * data/c++.m4 (b4_cxx_portability): New. (basic_symbol): In C++11, replace copy-ctors with move-ctors. In C++11, replace copies with moves. * data/lalr1.cc (stack_symbol_type, yypush_): Likewise. Use YY_MOVE to avoid useless copies. * data/variant.hh (variant): Support move-semantics. (make_SYMBOL): In C++11, in order to support both read-only lvalues, and rvalues, take the argument as a copy. * data/stack.hh (yypush_): Use rvalue-refs in C++11. * tests/c++.at: Use move semantics. * tests/headers.at: Adjust to the new macros (YY_MOVE, etc.). * configure.ac (CXX98_CXXFLAGS, CXX11_CXXFLAGS, CXX14_CXXFLAGS) (CXX17_CXXFLAGS, ENABLE_CXX11): New. * tests/atlocal.in: Receive them. * examples/variant.yy: Don't define things in std. * examples/variant-11.test, examples/variant-11.yy: New. Check the support of move-only types. * examples/README, examples/local.mk: Adjust.
271 lines
9.0 KiB
Plaintext
271 lines
9.0 KiB
Plaintext
# Configure template for GNU Bison. -*-Autoconf-*-
|
|
#
|
|
# Copyright (C) 2001-2015, 2018 Free Software Foundation, Inc.
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
# In order for some versions of Sun Studio to compile our C++ test cases
|
|
# correctly, we need Autoconf 2.64 or better to handle the restrict
|
|
# keyword in at least string.h from gnulib. We need Autoconf 2.68 or
|
|
# better to avoid a typo in the 'configure --help' entry for the YACC
|
|
# environment variable.
|
|
AC_PREREQ([2.68])
|
|
m4_pattern_forbid([^gl_[A-Z]])
|
|
|
|
AC_INIT([GNU Bison],
|
|
m4_esyscmd([build-aux/git-version-gen .tarball-version]),
|
|
[bug-bison@gnu.org])
|
|
AC_SUBST([PACKAGE_COPYRIGHT_YEAR], [2018])
|
|
AC_DEFINE_UNQUOTED([PACKAGE_COPYRIGHT_YEAR], [$PACKAGE_COPYRIGHT_YEAR],
|
|
[The copyright year for this package])
|
|
|
|
AC_CONFIG_AUX_DIR([build-aux])
|
|
AC_CONFIG_MACRO_DIR([m4])
|
|
|
|
# We use Automake 1.14's %D% and %C%.
|
|
#
|
|
# We want gnits strictness only when rolling a stable release. For
|
|
# release candidates, we use version strings like 2.4.3_rc1, but gnits
|
|
# doesn't like that, so we let the underscore disable gnits. Between
|
|
# releases, we want to be able run make dist without being required to
|
|
# add a bogus NEWS entry. In that case, the version string
|
|
# automatically contains a dash, which we also let disable gnits.
|
|
AM_INIT_AUTOMAKE([1.14 dist-xz nostdinc
|
|
color-tests parallel-tests
|
|
silent-rules]
|
|
m4_bmatch(m4_defn([AC_PACKAGE_VERSION]), [[-_]],
|
|
[gnu], [gnits]))
|
|
AM_SILENT_RULES([yes])
|
|
AC_CONFIG_HEADERS([lib/config.h:lib/config.in.h])
|
|
|
|
# Checks for the compiler.
|
|
AC_PROG_CC_STDC
|
|
AC_PROG_CXX
|
|
AC_LANG_PUSH([C++])
|
|
gl_WARN_ADD([-fno-exceptions], [NO_EXCEPTIONS_CXXFLAGS])
|
|
gl_WARN_ADD([-std=c++11], [CXX11_CXXFLAGS])
|
|
AM_CONDITIONAL([ENABLE_CXX11], [test x"$CXX11_CXXFLAGS" != x])
|
|
AC_LANG_POP([C++])
|
|
|
|
# Gnulib (early checks).
|
|
gl_EARLY
|
|
|
|
# Gnulib uses '#pragma GCC diagnostic push' to silence some
|
|
# warnings, but older gcc doesn't support this.
|
|
AC_CACHE_CHECK([whether pragma GCC diagnostic push works],
|
|
[lv_cv_gcc_pragma_push_works], [
|
|
save_CFLAGS=$CFLAGS
|
|
CFLAGS='-Wunknown-pragmas -Werror'
|
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
|
#pragma GCC diagnostic push
|
|
#pragma GCC diagnostic pop
|
|
]])],
|
|
[lv_cv_gcc_pragma_push_works=yes],
|
|
[lv_cv_gcc_pragma_push_works=no])
|
|
CFLAGS=$save_CFLAGS])
|
|
|
|
AC_ARG_ENABLE([gcc-warnings],
|
|
[ --enable-gcc-warnings turn on lots of GCC warnings (not recommended).
|
|
Also, issue synclines from the examples/ to
|
|
the corresponding source in the Texinfo doc.],
|
|
[case $enable_gcc_warnings in
|
|
yes|no) ;;
|
|
*) AC_MSG_ERROR([invalid value for --gcc-warnings: $enable_gcc_warnings]);;
|
|
esac],
|
|
[enable_gcc_warnings=no])
|
|
AM_CONDITIONAL([ENABLE_GCC_WARNINGS], [test "$enable_gcc_warnings" = yes])
|
|
if test "$enable_gcc_warnings" = yes; then
|
|
warn_common='-Wall -Wextra -Wno-sign-compare -Wcast-align
|
|
-fparse-all-comments -Wdocumentation
|
|
-Wformat -Wnull-dereference -Wpointer-arith -Wwrite-strings'
|
|
warn_c='-Wbad-function-cast -Wshadow -Wstrict-prototypes'
|
|
warn_cxx='-Wnoexcept'
|
|
# Warnings for the test suite only.
|
|
#
|
|
# -fno-color-diagnostics: Clang's use of colors in the error
|
|
# messages is confusing the tests looking at the compiler's output
|
|
# (e.g., synclines.at).
|
|
#
|
|
# -Wno-keyword-macro: We use the "#define private public" dirty
|
|
# trick in the test suite to check some private implementation
|
|
# details for lalr1.cc.
|
|
warn_tests='-Wundef -pedantic -Wdeprecated -Wsign-compare -fno-color-diagnostics
|
|
-Wno-keyword-macro'
|
|
|
|
AC_LANG_PUSH([C])
|
|
# Clang supports many of GCC's -W options, but only issues warnings
|
|
# on the ones it does not recognize. In that case, gl_WARN_ADD
|
|
# thinks the option is supported, and unknown options are then added
|
|
# to CFLAGS. But then, when -Werror is added in the test suite for
|
|
# instance, the warning about the unknown option turns into an
|
|
# error.
|
|
#
|
|
# This should be addressed by gnulib's gl_WARN_ADD, but in the
|
|
# meanwhile, turn warnings about unknown options into errors in
|
|
# CFLAGS, and restore CFLAGS after the tests.
|
|
save_CFLAGS=$CFLAGS
|
|
gl_WARN_ADD([-Werror=unknown-warning-option], [CFLAGS])
|
|
for i in $warn_common $warn_c;
|
|
do
|
|
gl_WARN_ADD([$i], [WARN_CFLAGS])
|
|
done
|
|
gl_WARN_ADD([-Werror], [WERROR_CFLAGS])
|
|
|
|
# Warnings for the test suite, and maybe for bison if GCC is modern
|
|
# enough.
|
|
gl_WARN_ADD([-Wmissing-declarations], [WARN_CFLAGS_TEST])
|
|
gl_WARN_ADD([-Wmissing-prototypes], [WARN_CFLAGS_TEST])
|
|
test $lv_cv_gcc_pragma_push_works = yes &&
|
|
AS_VAR_APPEND([WARN_CFLAGS], [" $WARN_CFLAGS_TEST"])
|
|
|
|
# Warnings for the test suite only.
|
|
for i in $warn_tests;
|
|
do
|
|
gl_WARN_ADD([$i], [WARN_CFLAGS_TEST])
|
|
done
|
|
CFLAGS=$save_CFLAGS
|
|
AC_LANG_POP([C])
|
|
|
|
AC_LANG_PUSH([C++])
|
|
save_CXXFLAGS=$CXXFLAGS
|
|
gl_WARN_ADD([-Werror=unknown-warning-option], [CXXFLAGS])
|
|
for i in $warn_common $warn_cxx;
|
|
do
|
|
gl_WARN_ADD([$i], [WARN_CXXFLAGS])
|
|
done
|
|
gl_WARN_ADD([-Wzero-as-null-pointer-constant], [WARN_CXXFLAGS],
|
|
[AC_LANG_PROGRAM([], [nullptr])])
|
|
gl_WARN_ADD([-Werror], [WERROR_CXXFLAGS])
|
|
# Warnings for the test suite only.
|
|
for i in $warn_tests;
|
|
do
|
|
gl_WARN_ADD([$i], [WARN_CXXFLAGS_TEST])
|
|
done
|
|
# Clang++ 3.2+ reject C code generated by Flex.
|
|
gl_WARN_ADD([-Wno-null-conversion], [FLEX_SCANNER_CXXFLAGS])
|
|
# So does G++ 4.8...
|
|
gl_WARN_ADD([-Wno-sign-compare], [FLEX_SCANNER_CXXFLAGS])
|
|
# ... possiby in std=c++11 mode.
|
|
gl_WARN_ADD([-Wno-zero-as-null-pointer-constant], [FLEX_SCANNER_CXXFLAGS])
|
|
CXXFLAGS=$save_CXXFLAGS
|
|
# Clang++ deprecates compiling C.
|
|
gl_WARN_ADD([-Wno-deprecated], [WNO_DEPRECATED_CXXFLAGS])
|
|
AC_LANG_POP([C++])
|
|
fi
|
|
|
|
|
|
BISON_TEST_FOR_WORKING_C_COMPILER
|
|
BISON_C_COMPILER_POSIXLY_CORRECT
|
|
BISON_TEST_FOR_WORKING_CXX_COMPILER
|
|
BISON_CXX_COMPILER_POSIXLY_CORRECT
|
|
|
|
AC_ARG_ENABLE([yacc],
|
|
[AC_HELP_STRING([--disable-yacc],
|
|
[do not build a yacc command or an -ly library])],
|
|
, [enable_yacc=yes])
|
|
AM_CONDITIONAL([ENABLE_YACC], [test "$enable_yacc" = yes])
|
|
|
|
# Checks for programs.
|
|
AM_MISSING_PROG([DOT], [dot])
|
|
AC_PROG_LEX
|
|
$LEX_IS_FLEX || test "X$LEX" = X: || {
|
|
AC_MSG_WARN([bypassing lex because flex is required])
|
|
LEX=:
|
|
}
|
|
AM_CONDITIONAL([FLEX_CXX_WORKS],
|
|
[$LEX_IS_FLEX && test $bison_cv_cxx_works = yes])
|
|
AC_PROG_YACC
|
|
AC_PROG_RANLIB
|
|
AC_PROG_GNU_M4
|
|
AC_DEFINE_UNQUOTED([M4], ["$M4"], [Define to the GNU M4 executable name.])
|
|
AC_DEFINE_UNQUOTED([M4_GNU_OPTION], ["$M4_GNU"], [Define to "-g" if GNU M4
|
|
supports -g, otherwise to "".])
|
|
AC_PATH_PROG([PERL], [perl])
|
|
if test -z "$PERL"; then
|
|
AC_MSG_ERROR([perl not found])
|
|
fi
|
|
AM_MISSING_PROG([HELP2MAN], [help2man])
|
|
AC_PATH_PROG([XSLTPROC], [xsltproc])
|
|
AC_SUBST([XSLTPROC])
|
|
|
|
# Checks for header files.
|
|
AC_CHECK_HEADERS_ONCE([locale.h])
|
|
|
|
# Checks for compiler characteristics.
|
|
AC_C_INLINE
|
|
|
|
# Gnulib (later checks). Putting them here rather than right after
|
|
# gl_EARLY avoids some redundant checks.
|
|
gl_INIT
|
|
|
|
# Checks for library functions.
|
|
AC_CHECK_FUNCS_ONCE([setlocale])
|
|
AM_WITH_DMALLOC
|
|
BISON_PREREQ_TIMEVAR
|
|
|
|
# Gettext.
|
|
# We use gnulib, which is only guaranteed to work properly with the
|
|
# latest Gettext.
|
|
AM_GNU_GETTEXT([external], [need-ngettext])
|
|
AM_GNU_GETTEXT_VERSION([0.18])
|
|
BISON_I18N
|
|
|
|
# Internationalized parsers.
|
|
AC_CONFIG_FILES([runtime-po/Makefile.in])
|
|
# Autoconf macros for packages using internationalized parsers.
|
|
aclocaldir='${datadir}/aclocal'
|
|
AC_SUBST([aclocaldir])
|
|
|
|
# Create the benchmark script.
|
|
AC_CONFIG_FILES([etc/bench.pl], [chmod +x etc/bench.pl])
|
|
|
|
# Initialize the test suite.
|
|
AC_CONFIG_TESTDIR(tests)
|
|
AC_CONFIG_FILES([tests/atlocal])
|
|
AC_CONFIG_FILES([tests/bison], [chmod +x tests/bison])
|
|
|
|
AC_CHECK_PROGS([VALGRIND], [valgrind])
|
|
# Use something simpler that $host_os to select our suppression file.
|
|
uname=`uname`
|
|
case $VALGRIND:$uname in
|
|
'':*) ;;
|
|
*:Darwin)
|
|
# See README-hacking.
|
|
VALGRIND=;;
|
|
*:*)
|
|
suppfile=build-aux/$uname.valgrind
|
|
if test -f "$srcdir/$suppfile"; then
|
|
AC_SUBST([VALGRIND_OPTS_SUPPRESSION],
|
|
["--suppressions=\$(abs_top_srcdir)/$suppfile"])
|
|
fi
|
|
;;
|
|
esac
|
|
AC_MSG_CHECKING([Valgrind suppression file])
|
|
AC_MSG_RESULT([$suppfile])
|
|
|
|
# Whether we cannot run the compiled bison.
|
|
AM_CONDITIONAL([CROSS_COMPILING], [test "$cross_compiling" = yes])
|
|
|
|
AM_MISSING_PROG([AUTOM4TE], [autom4te])
|
|
# Needed by tests/atlocal.in.
|
|
AC_SUBST([GCC])
|
|
|
|
gt_JAVACOMP([1.3], [1.4])
|
|
gt_JAVAEXEC
|
|
|
|
AC_CONFIG_FILES([Makefile
|
|
po/Makefile.in
|
|
doc/yacc.1])
|
|
AC_OUTPUT
|