https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120029

--- Comment #6 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Actually it looks like we can make it optimally efficient without any
difficulty:


--- a/libstdc++-v3/src/c++17/fs_path.cc
+++ b/libstdc++-v3/src/c++17/fs_path.cc
@@ -914,6 +914,10 @@ path::operator+=(const path& p)
   _Cmpt* last = nullptr;
   if (p._M_type() == _Type::_Multi)
     {
+      // For p += p we reallocate now, to avoid dangling pointers later.
+      if (&p == this) [[unlikely]]
+       _M_cmpts.reserve(2 * _M_cmpts.size());
+
       it = p._M_cmpts._M_impl->begin();
       last = p._M_cmpts._M_impl->end();
     }

Reply via email to