diff mbox

profile mode fix

Message ID CAH6eHdQPpktHs6HR8NRCk955U_PmG0xxrBjFNwHaTSTzaWZN-A@mail.gmail.com
State New
Headers show

Commit Message

Jonathan Wakely Jan. 26, 2014, 10:38 a.m. UTC
On 26 January 2014 09:43, François Dumont wrote:
> Hi
>
>     This is a patch to fix PR 55033 in profile mode. Like in debug mode it
> was missing noexcept qualifier on move constructor.

But don't those functions allocate memory? So they can throw.

I agree we want the move constructor to be noexcept anyway, and maybe
the default constructor, but why would we want to lie about the copy
constructor?

I have this patch in my tree that I'm trying to decide whether it
should be committed, but if we make the change we should have a
comment like this:

Comments

François Dumont Jan. 27, 2014, 10:18 p.m. UTC | #1
Indeed, default constructor and copy constructor shall not be noexcept 
qualified.

IMO we should be able to make move constructor noexcept by using a 
special allocator for the underlying unordered_map that would allow to 
replace an entry with an other one without requiring a 
deallocate/allocate. It would be the same kind of allocator keeping a 
released instance in cache that you already talk about to enhance 
std::deque behavior especially when used in a std::queue.

For 4.9 we could consider that this test is not supported in profile 
mode and I will work on it for next version.

François


On 01/26/2014 11:38 AM, Jonathan Wakely wrote:
> On 26 January 2014 09:43, François Dumont wrote:
>> Hi
>>
>>      This is a patch to fix PR 55033 in profile mode. Like in debug mode it
>> was missing noexcept qualifier on move constructor.
> But don't those functions allocate memory? So they can throw.
>
> I agree we want the move constructor to be noexcept anyway, and maybe
> the default constructor, but why would we want to lie about the copy
> constructor?
>
> I have this patch in my tree that I'm trying to decide whether it
> should be committed, but if we make the change we should have a
> comment like this:
>
> --- a/libstdc++-v3/include/profile/unordered_base.h
> +++ b/libstdc++-v3/include/profile/unordered_base.h
> @@ -160,9 +160,14 @@ namespace __profile
>           __profcxx_hashtable_construct(&__uc, __uc.bucket_count());
>          __profcxx_hashtable_construct2(&__uc);
>         }
> +
>         _Unordered_profile(const _Unordered_profile&)
>          : _Unordered_profile() { }
> -      _Unordered_profile(_Unordered_profile&&)
> +
> +      // This might actually throw, but for consistency with normal mode
> +      // unordered containers we want the noexcept specification, and will
> +      // std::terminate() if an exception is thrown.
> +      _Unordered_profile(_Unordered_profile&&) noexcept
>          : _Unordered_profile() { }
>
>         ~_Unordered_profile() noexcept
>
diff mbox

Patch

--- a/libstdc++-v3/include/profile/unordered_base.h
+++ b/libstdc++-v3/include/profile/unordered_base.h
@@ -160,9 +160,14 @@  namespace __profile
         __profcxx_hashtable_construct(&__uc, __uc.bucket_count());
        __profcxx_hashtable_construct2(&__uc);
       }
+
       _Unordered_profile(const _Unordered_profile&)
        : _Unordered_profile() { }
-      _Unordered_profile(_Unordered_profile&&)
+
+      // This might actually throw, but for consistency with normal mode
+      // unordered containers we want the noexcept specification, and will
+      // std::terminate() if an exception is thrown.
+      _Unordered_profile(_Unordered_profile&&) noexcept
        : _Unordered_profile() { }

       ~_Unordered_profile() noexcept