@@ -585,6 +585,27 @@ namespace STDEXEC::__any
585585
586586 // ////////////////////////////////////////////////////////////////////////////////////////
587587 // __emplace_into
588+ template <class _Alloc2 >
589+ struct __dealloc_guard
590+ {
591+ _Alloc2 &__alloc;
592+ typename std::allocator_traits<_Alloc2>::pointer __ptr;
593+ bool __dismissed = false ;
594+
595+ constexpr void __dismiss () noexcept
596+ {
597+ __dismissed = true ;
598+ }
599+
600+ constexpr ~__dealloc_guard () noexcept
601+ {
602+ if (!__dismissed)
603+ {
604+ std::allocator_traits<_Alloc2>::deallocate (__alloc, __ptr, 1 );
605+ }
606+ }
607+ };
608+
588609 template <class _Model , class _Allocator , class ... _Args>
589610 constexpr _Model &__emplace_into ([[maybe_unused]] _Allocator const &__alloc,
590611 [[maybe_unused]] __iroot *&__root_ptr,
@@ -606,10 +627,10 @@ namespace STDEXEC::__any
606627 }
607628 else
608629 {
609- auto __alloc2 = STDEXEC ::__rebind_allocator<_Model>(__alloc);
610- using __traits_t = std::allocator_traits<decltype (__alloc2)>;
611- auto *const __model = __traits_t::allocate (__alloc2, 1 );
612- __scope_guard __guard{[&]() noexcept { __traits_t::deallocate ( __alloc2, __model, 1 ); } };
630+ auto __alloc2 = STDEXEC ::__rebind_allocator<_Model>(__alloc);
631+ using __traits_t = std::allocator_traits<decltype (__alloc2)>;
632+ auto *const __model = __traits_t::allocate (__alloc2, 1 );
633+ __dealloc_guard< decltype (__alloc2)> __guard{ __alloc2, __model};
613634 __traits_t::construct (__alloc2, __model, static_cast <_Args &&>(__args)...);
614635 __guard.__dismiss ();
615636 *__std::start_lifetime_as<__tagged_ptr>(__buff.data ()) = __tagged_ptr (__model);
0 commit comments