From b1482aa91b16e46cfed46cb4c4c41cfe34dfd434 Mon Sep 17 00:00:00 2001 From: Nikolas Klauser Date: Wed, 6 Aug 2025 17:50:53 +0200 Subject: [PATCH] [libc++] Fix incorrect down cast in __tree::operator= (#152285) This has been introduced by #151304. This problem is diagnosed by UBSan with optimizations enabled. Since we run UBSan only with optimizations disabled currently, this isn't caught in our CI. We should look into enabling UBSan with optimizations enabled to catch these sorts of issues before landing a patch. --- libcxx/include/__tree | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libcxx/include/__tree b/libcxx/include/__tree index 6ca1a623536f..74b20d5b6f81 100644 --- a/libcxx/include/__tree +++ b/libcxx/include/__tree @@ -1388,8 +1388,9 @@ __tree<_Tp, _Compare, _Allocator>& __tree<_Tp, _Compare, _Allocator>::operator=( if (__root()) __root()->__parent_ = __end_node(); } - __begin_node_ = static_cast<__end_node_pointer>(std::__tree_min(static_cast<__node_base_pointer>(__end_node()))); - __size_ = __t.size(); + __begin_node_ = + __end_node()->__left_ ? static_cast<__end_node_pointer>(std::__tree_min(__end_node()->__left_)) : __end_node(); + __size_ = __t.size(); return *this; }