Opened 6 years ago

Last modified 6 years ago

#12806 new Bugs

flat_map.hpp function force_copy break strict-aliasing on gcc < 4.4

Reported by: Vladislav <phprus@…> Owned by: Ion Gaztañaga
Milestone: To Be Determined Component: container
Version: Boost 1.63.0 Severity: Showstopper
Keywords: Cc:

Description

Hello!

On function (https://github.com/boostorg/container/blob/develop/include/boost/container/flat_map.hpp#L61):

template<class D, class S>
BOOST_CONTAINER_FORCEINLINE static D force_copy(S s)
{
   D *vp = reinterpret_cast<D *>(&s);
   return D(*vp);
}

gcc 4.3.4 (SLE 11) produced wrong code. It seems that the compiler does not create a copy of an object "s" and returns an object of D().

If I change the signature of function on "BOOST_CONTAINER_FORCEINLINE static D force_copy(const S& s)" the code works and the tests pass. But then does not create a copy of an object "s" in a function call.

I'm not sure that this change is correct. Is there any other workaround for this problem with a compiler gcc 4.3 or better disable strict-aliasing?

Change History (1)

comment:1 by Ion Gaztañaga, 6 years ago

Sorry for the long delay. Catching by const reference should not be a problem. I'll try to test it in several compilers.

Note: See TracTickets for help on using tickets.