summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tests/010/tree.tl8
-rw-r--r--tree.c4
2 files changed, 10 insertions, 2 deletions
diff --git a/tests/010/tree.tl b/tests/010/tree.tl
index 56d04fa9..9d00fda6 100644
--- a/tests/010/tree.tl
+++ b/tests/010/tree.tl
@@ -166,7 +166,7 @@
(tree-delete tr 18) 18
(tree-delete tr 19) 19)
-(set *tree-fun-whitelist* [list* '= '< *tree-fun-whitelist*])
+(set *tree-fun-whitelist* [list* '= '< 'to *tree-fun-whitelist*])
(let ((tr [tree '(1 2 3) identity < =]))
(mtest
@@ -256,3 +256,9 @@
(tree-del-min tr) 10
(tree-count tr) 0
(tree-del-min tr) nil))
+
+(let* ((tr [tree '(#R(1 10) #R(11 20) #R(21 30)) to])
+ (node (tree-lookup-node tr 10)))
+ (test node #N(#R(1 10) nil nil))
+ (tree-delete-specific-node tr node)
+ (test tr #T((to) #R(11 20) #R(21 30))))
diff --git a/tree.c b/tree.c
index 3a5f52db..01844931 100644
--- a/tree.c
+++ b/tree.c
@@ -589,8 +589,10 @@ static val tr_delete(val tree, struct tree *tr, val key)
static val tr_delete_specific(val tree, struct tree *tr, val thisnode)
{
if (tr->root) {
+ val nkey = key(thisnode);
+ val key = if3(tr->key_fn, funcall1(tr->key_fn, nkey), nkey);
val node = tr_do_delete_specific(tree, tr, tr->root,
- nil, key(thisnode), thisnode);
+ nil, key, thisnode);
if (node) {
if (2 * --tr->size < tr->max_size) {
tr_rebuild(tree, tr, tr->root, nil, tr->size);