commit:     bebb08842689ea39ed4806947fcdc03c21c4e33b
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Tue Dec 24 07:37:09 2024 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Tue Dec 24 07:37:09 2024 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=bebb0884

sys-devel/bison: fix tests w/ -D_GLIBCXX_ASSERTIONS in GCC 15

Closes: https://bugs.gentoo.org/935754
Thanks-to: Arsen Arsenović <arsen <AT> gentoo.org>
Signed-off-by: Sam James <sam <AT> gentoo.org>

 sys-devel/bison/bison-3.8.2-r3.ebuild              | 109 +++++++++++++++++++++
 .../bison-3.8.2-gcc15-glibcxx-assertions.patch     |  69 +++++++++++++
 2 files changed, 178 insertions(+)

diff --git a/sys-devel/bison/bison-3.8.2-r3.ebuild 
b/sys-devel/bison/bison-3.8.2-r3.ebuild
new file mode 100644
index 000000000000..966b52d053aa
--- /dev/null
+++ b/sys-devel/bison/bison-3.8.2-r3.ebuild
@@ -0,0 +1,109 @@
+# Copyright 1999-2024 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+VERIFY_SIG_OPENPGP_KEY_PATH=/usr/share/openpgp-keys/bison.asc
+inherit flag-o-matic multiprocessing verify-sig
+
+DESCRIPTION="A general-purpose (yacc-compatible) parser generator"
+HOMEPAGE="https://www.gnu.org/software/bison/";
+SRC_URI="mirror://gnu/${PN}/${P}.tar.xz"
+SRC_URI+=" verify-sig? ( mirror://gnu/${PN}/${P}.tar.xz.sig )"
+
+LICENSE="GPL-3+"
+SLOT="0"
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~loong ~m68k ~mips ~ppc ~ppc64 
~riscv ~s390 ~sparc ~x86 ~amd64-linux ~x86-linux ~arm64-macos ~ppc-macos 
~x64-macos ~x64-solaris"
+IUSE="examples nls static test"
+RESTRICT="!test? ( test )"
+
+# gettext _IS_ required in RDEPEND because >=bison-3.7 links against
+# libtextstyle.so!!! (see bug #740754)
+DEPEND="
+       >=sys-devel/m4-1.4.16
+       >=sys-devel/gettext-0.21
+"
+RDEPEND="${DEPEND}"
+BDEPEND="
+       app-alternatives/lex
+       test? ( dev-lang/perl )
+       verify-sig? ( sec-keys/openpgp-keys-bison )
+"
+PDEPEND="app-alternatives/yacc"
+
+DOCS=( AUTHORS ChangeLog NEWS README THANKS TODO ) # ChangeLog-2012 
ChangeLog-1998 PACKAGING README-alpha README-release
+
+PATCHES=(
+       "${FILESDIR}"/${PN}-3.8.2-gcc15-glibcxx-assertions.patch
+)
+
+src_prepare() {
+       # Old logic when we needed to patch configure.ac
+       # Keeping in case it's useful for future
+
+       # Record date to avoid 'config.status --recheck' & regen of 
'tests/package.m4'
+       #touch -r configure.ac old.configure.ac || die
+       #touch -r configure old.configure || die
+
+       #eapply "${WORKDIR}"/patches
+       #default
+
+       # Restore date after patching
+       #touch -r old.configure.ac configure.ac || die
+       #touch -r old.configure configure || die
+
+       # The makefiles make the man page depend on the configure script
+       # which we patched above.  Touch it to prevent regeneration.
+       #touch doc/bison.1 || die #548778 #538300#9
+
+       default
+
+       # Avoid regenerating the info page when the timezone is diff. #574492
+       sed -i '2iexport TZ=UTC' build-aux/mdate-sh || die
+}
+
+src_configure() {
+       use static && append-ldflags -static
+
+       local myeconfargs=(
+               $(use_enable nls)
+       )
+
+       econf "${myeconfargs[@]}"
+}
+
+src_test() {
+       emake check TESTSUITEFLAGS="--jobs=$(get_makeopts_jobs)"
+}
+
+src_install() {
+       default
+
+       # These are owned by app-alternatives/yacc
+       mv "${ED}"/usr/bin/yacc{,.bison} || die
+       mv "${ED}"/usr/share/man/man1/yacc{,.bison}.1 || die
+
+       # We do not need liby.a
+       rm -r "${ED}"/usr/lib* || die
+
+       # Examples are about 200K, so let's make them optional still for now.
+       if ! use examples ; then
+               rm -r "${ED}"/usr/share/doc/${PF}/examples/ || die
+       fi
+}
+
+pkg_postinst() {
+       # ensure to preserve the symlinks before app-alternatives/yacc
+       # is installed
+       if [[ ! -h ${EROOT}/usr/bin/yacc ]]; then
+               if [[ -e ${EROOT}/usr/bin/yacc ]] ; then
+                       # bug #886123
+                       ewarn "${EROOT}/usr/bin/yacc exists but is not a 
symlink."
+                       ewarn "This is expected during Prefix bootstrap and 
unusual otherwise."
+                       ewarn "Moving away unexpected ${EROOT}/usr/bin/yacc to 
.bak."
+                       mv "${EROOT}/usr/bin/yacc" "${EROOT}/usr/bin/yacc.bak" 
|| die
+               fi
+
+               ln -s yacc.bison "${EROOT}/usr/bin/yacc" || die
+       fi
+}

diff --git a/sys-devel/bison/files/bison-3.8.2-gcc15-glibcxx-assertions.patch 
b/sys-devel/bison/files/bison-3.8.2-gcc15-glibcxx-assertions.patch
new file mode 100644
index 000000000000..245cc842a7be
--- /dev/null
+++ b/sys-devel/bison/files/bison-3.8.2-gcc15-glibcxx-assertions.patch
@@ -0,0 +1,69 @@
+https://bugs.gentoo.org/935754
+https://lists.gnu.org/archive/html/bison-patches/2024-07/msg00000.html
+
+* data/skeletons/glr2.cc (yyundeleteLastStack): Recover
+yylookaheadNeeds stack entry also, to prevent desyncing the sizes
+of yystates and yylookaheadNeeds.
+(class glr_state_set): New field yylookaheadNeedLastDeleted,
+tracks lookahead need of last deleted state.
+(yymarkStackDeleted): Save yylookaheadNeeds also.
+---
+Hi!
+
+GCC 15 has added bounds-checks to vector<bool> when assertions are
+enabled.  This has caught a bug in Bison.  See bug referenced above.
+
+Now, WRT the fix: I am not sure of its correctness, but it appears to
+pass tests and everything seems to indicate that the presumption it is
+based on is correct.  That presumption is that the two stacks mentioned
+above (yylookaheadNeeds and yystates) ought to be the same size.  I
+inferred this because all other locations that alter the size of the two
+vectors appear to do so in lock-step.
+
+TIA, have a lovely day.
+
+ data/skeletons/glr2.cc | 8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+diff --git a/data/skeletons/glr2.cc b/data/skeletons/glr2.cc
+index 970ccfdf..8b962d6f 100644
+--- a/data/skeletons/glr2.cc
++++ b/data/skeletons/glr2.cc
+@@ -1080,7 +1080,10 @@ namespace
+     {
+       size_t k = yyk.uget ();
+       if (yystates[k] != YY_NULLPTR)
+-        yylastDeleted = yystates[k];
++        {
++          yylastDeleted = yystates[k];
++          yylookaheadNeedLastDeleted = yylookaheadNeeds[k];
++        }
+       yystates[k] = YY_NULLPTR;
+     }
+ 
+@@ -1093,6 +1096,7 @@ namespace
+       if (yylastDeleted == YY_NULLPTR || !yystates.empty ())
+         return;
+       yystates.push_back (yylastDeleted);
++      yylookaheadNeeds.push_back (yylookaheadNeedLastDeleted);
+       YYCDEBUG << "Restoring last deleted stack as stack #0.\n";
+       clearLastDeleted ();
+     }
+@@ -1102,6 +1106,7 @@ namespace
+     void
+     yyremoveDeletes ()
+     {
++      YYASSERT(yystates.size () == yylookaheadNeeds.size ());
+       size_t newsize = yystates.size ();
+       /* j is the number of live stacks we have seen.  */
+       for (size_t i = 0, j = 0; j < newsize; ++i)
+@@ -1160,6 +1165,7 @@ namespace
+ 
+     /** The last stack we invalidated.  */
+     glr_state* yylastDeleted;
++    bool yylookaheadNeedLastDeleted;
+   }; // class glr_state_set
+ } // namespace
+ 
+-- 
+2.45.2

Reply via email to