commit:     3cd4670949925ba41cf339fb2885a49bb0fd9ab2
Author:     Holger Hoffstätte <holger <AT> applied-asynchrony <DOT> com>
AuthorDate: Wed Feb 11 21:32:36 2026 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Wed Feb 11 23:40:44 2026 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=3cd46709

dev-cpp/tree: fixes for gcc-16 compile/test failures

Also unhardcode g++ to allow building/testing with different compilers.

Closes: https://bugs.gentoo.org/964308
Signed-off-by: Holger Hoffstätte <holger <AT> applied-asynchrony.com>
Part-of: https://github.com/gentoo/gentoo/pull/45767
Closes: https://github.com/gentoo/gentoo/pull/45767
Signed-off-by: Sam James <sam <AT> gentoo.org>

 dev-cpp/tree/files/3.18-add-missing-insert.patch | 82 ++++++++++++++++++++++++
 dev-cpp/tree/files/3.18-const.patch              | 23 +++++++
 dev-cpp/tree/files/3.18-cxx.patch                | 27 ++++++++
 dev-cpp/tree/files/3.18-fix-move-out.patch       | 46 +++++++++++++
 dev-cpp/tree/tree-3.18-r1.ebuild                 | 46 +++++++++++++
 5 files changed, 224 insertions(+)

diff --git a/dev-cpp/tree/files/3.18-add-missing-insert.patch 
b/dev-cpp/tree/files/3.18-add-missing-insert.patch
new file mode 100644
index 000000000000..adf3776448ac
--- /dev/null
+++ b/dev-cpp/tree/files/3.18-add-missing-insert.patch
@@ -0,0 +1,82 @@
+https://github.com/kpeeters/tree.hh/commit/1bd1cd80cdcec2ba1c677ee0ef3766a9485d1d2f
+
+From: Kasper Peeters <[email protected]>
+Date: Fri, 17 Nov 2023 11:24:49 +0000
+Subject: [PATCH] Add a missing 'insert(sibling_iterators, T&&)'. Fixes issue
+ #24.
+
+---
+ src/tree.hh | 39 +++++++++++++++++++++++++++++++++++----
+ 1 file changed, 35 insertions(+), 4 deletions(-)
+
+diff --git a/src/tree.hh b/src/tree.hh
+index 906cda1..d460165 100644
+--- a/src/tree.hh
++++ b/src/tree.hh
+@@ -1,7 +1,7 @@
+ 
+ //    STL-like templated tree class.
+ //
+-// Copyright (C) 2001-2020 Kasper Peeters <[email protected]>
++// Copyright (C) 2001-2023 Kasper Peeters <[email protected]>
+ // Distributed under the GNU General Public License version 3.
+ //
+ // Special permission to use tree.hh under the conditions of a 
+@@ -9,9 +9,8 @@
+ 
+ /** \mainpage tree.hh
+     \author   Kasper Peeters
+-    \version  3.18
+-    \date     13-Feb-2021
+-    \see      http://tree.phi-sci.com/
++    \version  3.19
++    \date     2023-11-17
+     \see      http://github.com/kpeeters/tree.hh/
+ 
+    The tree.hh library for C++ provides an STL-like container class
+@@ -363,6 +362,7 @@ class tree {
+               template<typename iter> iter insert(iter position, T&& x);
+               /// Specialisation of previous member.
+               sibling_iterator insert(sibling_iterator position, const T& x);
++              sibling_iterator insert(sibling_iterator position, T&& x);
+               /// Insert node (with children) pointed to by subtree as 
previous sibling of node pointed to by position.
+               /// Does not change the subtree itself (use move_in or 
move_in_below for that).
+               template<typename iter> iter insert_subtree(iter position, 
const iterator_base& subtree);
+@@ -1363,6 +1363,37 @@ typename tree<T, tree_node_allocator>::sibling_iterator 
tree<T, tree_node_alloca
+       return tmp;
+       }
+ 
++template <class T, class tree_node_allocator>
++typename tree<T, tree_node_allocator>::sibling_iterator tree<T, 
tree_node_allocator>::insert(sibling_iterator position, T&& x)
++      {
++      tree_node 
*tmp=std::allocator_traits<decltype(alloc_)>::allocate(alloc_, 1, 0);
++      std::allocator_traits<decltype(alloc_)>::construct(alloc_, tmp);
++      std::swap(tmp->data, x); // Move semantics
++
++      tmp->first_child=0;
++      tmp->last_child=0;
++
++      tmp->next_sibling=position.node;
++      if(position.node==0) { // iterator points to end of a subtree
++              tmp->parent=position.parent_;
++              tmp->prev_sibling=position.range_last();
++              tmp->parent->last_child=tmp;
++              }
++      else {
++              tmp->parent=position.node->parent;
++              tmp->prev_sibling=position.node->prev_sibling;
++              position.node->prev_sibling=tmp;
++              }
++
++      if(tmp->prev_sibling==0) {
++              if(tmp->parent) // when inserting nodes at the head, there is 
no parent
++                      tmp->parent->first_child=tmp;
++              }
++      else
++              tmp->prev_sibling->next_sibling=tmp;
++      return tmp;
++      }
++
+ template <class T, class tree_node_allocator>
+ template <class iter>
+ iter tree<T, tree_node_allocator>::insert_after(iter position, const T& x)

diff --git a/dev-cpp/tree/files/3.18-const.patch 
b/dev-cpp/tree/files/3.18-const.patch
new file mode 100644
index 000000000000..580c23f7ac53
--- /dev/null
+++ b/dev-cpp/tree/files/3.18-const.patch
@@ -0,0 +1,23 @@
+https://github.com/kpeeters/tree.hh/commit/0ee8b5a4c3a93814bbf465ffc56c296cf84f1832
+
+From: Kasper Peeters <[email protected]>
+Date: Fri, 17 Nov 2023 11:27:13 +0000
+Subject: [PATCH] Fix const-correctness for comparison.
+
+---
+ src/tree.hh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/tree.hh b/src/tree.hh
+index d460165..be45f99 100644
+--- a/src/tree.hh
++++ b/src/tree.hh
+@@ -505,7 +505,7 @@ class tree {
+                       public:
+                               compare_nodes(StrictWeakOrdering comp) : 
comp_(comp) {}
+                               
+-                              bool operator()(const tree_node *a, const 
tree_node *b) 
++                              bool operator()(const tree_node *a, const 
tree_node *b) const
+                                       {
+                                       return comp_(a->data, b->data);
+                                       }

diff --git a/dev-cpp/tree/files/3.18-cxx.patch 
b/dev-cpp/tree/files/3.18-cxx.patch
new file mode 100644
index 000000000000..e5562dfee4f6
--- /dev/null
+++ b/dev-cpp/tree/files/3.18-cxx.patch
@@ -0,0 +1,27 @@
+--- tree.hh-3.18/src/Makefile
++++ tree.hh-3.18/src/Makefile
+@@ -2,19 +2,19 @@
+ all: test1 test2 test_tree
+ 
+ %.o: %.cc tree.hh
+-      g++ -g -c -o $@ -Wall -O2 -std=c++11 -I. $<
++      $(CXX) -g -c -o $@ -Wall -O2 -std=c++11 -I. $<
+ 
+ test1: test1.o 
+-      g++ -o test1 test1.o
++      $(CXX) -o test1 test1.o
+ 
+ test2: test2.o 
+-      g++ -o test2 test2.o
++      $(CXX) -o test2 test2.o
+ 
+ test_tree: test_tree.o
+-      g++ -o test_tree test_tree.o
++      $(CXX) -o test_tree test_tree.o
+ 
+ sample_path: sample_path.o
+-      g++ -o sample_path sample_path.o
++      $(CXX) -o sample_path sample_path.o
+ 
+ run_tests: test1 test1.req
+       ./test1 > test1.res

diff --git a/dev-cpp/tree/files/3.18-fix-move-out.patch 
b/dev-cpp/tree/files/3.18-fix-move-out.patch
new file mode 100644
index 000000000000..9f72b438720b
--- /dev/null
+++ b/dev-cpp/tree/files/3.18-fix-move-out.patch
@@ -0,0 +1,46 @@
+https://github.com/kpeeters/tree.hh/commit/66f71a672698909e5b613a3c04a918bac3d4282f
+
+From: Kasper Peeters <[email protected]>
+Date: Fri, 17 Nov 2023 11:33:30 +0000
+Subject: [PATCH] Fix move_out for cases when the moved-out node was first or
+ last child of the old parent.
+
+---
+ src/tree.hh | 17 ++++++++++++++++-
+ 1 file changed, 16 insertions(+), 1 deletion(-)
+
+diff --git a/src/tree.hh b/src/tree.hh
+index be45f99..743a81b 100644
+--- a/src/tree.hh
++++ b/src/tree.hh
+@@ -1860,7 +1860,6 @@ tree<T, tree_node_allocator> tree<T, 
tree_node_allocator>::move_out(iterator sou
+       // Move source node into the 'ret' tree.
+       ret.head->next_sibling = source.node;
+       ret.feet->prev_sibling = source.node;
+-      source.node->parent=0;
+ 
+       // Close the links in the current tree.
+       if(source.node->prev_sibling!=0) 
+@@ -1869,6 +1868,22 @@ tree<T, tree_node_allocator> tree<T, 
tree_node_allocator>::move_out(iterator sou
+       if(source.node->next_sibling!=0) 
+               source.node->next_sibling->prev_sibling = 
source.node->prev_sibling;
+ 
++      // If the moved-out node was a first or last child of
++      // the parent, adjust those links.
++      if(source.node->parent->first_child==source.node) { 
++              if(source.node->next_sibling!=0)
++                      
source.node->parent->first_child=source.node->next_sibling;
++              else
++                      source.node->parent->first_child=0;
++              }
++      if(source.node->parent->last_child==source.node) { 
++              if(source.node->prev_sibling!=0)
++                      
source.node->parent->last_child=source.node->prev_sibling;
++              else
++                      source.node->parent->last_child=0;
++              }
++      source.node->parent=0;
++      
+       // Fix source prev/next links.
+       source.node->prev_sibling = ret.head;
+       source.node->next_sibling = ret.feet;

diff --git a/dev-cpp/tree/tree-3.18-r1.ebuild b/dev-cpp/tree/tree-3.18-r1.ebuild
new file mode 100644
index 000000000000..8e80f85b9080
--- /dev/null
+++ b/dev-cpp/tree/tree-3.18-r1.ebuild
@@ -0,0 +1,46 @@
+# Copyright 1999-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+DOCS_BUILDER="doxygen"
+DOCS_CONFIG_NAME="doxygen_tree.config"
+DOCS_DIR="doc"
+
+inherit docs toolchain-funcs
+
+DESCRIPTION="An STL-like tree class"
+HOMEPAGE="https://github.com/kpeeters/tree.hh";
+SRC_URI="https://github.com/kpeeters/tree.hh/archive/refs/tags/${PV}.tar.gz -> 
${P}.tar.gz"
+S="${WORKDIR}/${PN}.hh-${PV}"
+
+LICENSE="|| ( GPL-2 GPL-3 )"
+SLOT="0"
+KEYWORDS="~amd64 ~ppc64 ~x86"
+
+PATCHES=(
+       "${FILESDIR}"/3.18-add-missing-insert.patch
+       "${FILESDIR}"/3.18-const.patch
+       "${FILESDIR}"/3.18-cxx.patch
+       "${FILESDIR}"/3.18-fix-move-out.patch
+)
+
+src_configure() {
+       tc-export CXX
+}
+
+src_compile() {
+       docs_compile
+}
+
+src_test() {
+       cd src || die
+       emake
+       emake run_tests
+}
+
+src_install() {
+       doheader src/tree.hh src/tree_util.hh
+       dodoc -r examples
+       einstalldocs
+}

Reply via email to