Opened 6 years ago

Last modified 5 years ago

#7219 new Bugs

boost::optional<int> gives strict alias warning on GCC 4.4.6, breaks at runtime

Reported by: Tony.Astolfi@… Owned by: Fernando Cacciola
Milestone: To Be Determined Component: optional
Version: Boost 1.51.0 Severity: Showstopper
Keywords: Cc:

Description (last modified by viboes)

Here is my test code:

#include <boost/optional.hpp>

struct my_type
{
#if 1 // change to 0 to see the problem disappear
    typedef boost::optional<int> value_type;
#else
    typedef boost::optional<int __attribute((__may_alias__))> value_type;
#endif

    value_type value_;

    void set (int value)
    {
        value_ = value;
    }
                
    value_type get ()
    {
        return value_;
    }

}; // class event

void testCase ()
{
    my_type a;
    a.set(4);
    bool const b = 4 == ( *a.get() );
    if( !b ) abort(); // will abort unless 'may_alias' attribute is added to 'int'
}

Here is my compile line:

g++ -c src/thread/unittest/test_gcc_bug.cpp -o ../../../derived/glnxa64/obj/deployment_server/foundation/util/src/thread/unittest/test_gcc_bug.o -MD -MF ../../../derived/glnxa64/obj/deployment_server/foundation/util/src/thread/unittest/test_gcc_bug.d -MP -MT ../../../derived/glnxa64/obj/deployment_server/foundation/util/src/thread/unittest/test_gcc_bug.o -I../../../src/include -I../../../derived/glnxa64/src/include -I../include -I../../include -I//mathworks/hub/3rdparty/R2013a/356881/glnxa64/boost/include -I//mathworks/hub/3rdparty/R2013a/356141/glnxa64/cpp11compat/include -I//mathworks/hub/3rdparty/R2013a/356141/glnxa64/cpp11compat/include -I//mathworks/hub/3rdparty/R2013a/350182/glnxa64/protobuf/include -I//mathworks/hub/3rdparty/R2013a/350182/glnxa64/tbb/include   -DBOOST_FILESYSTEM_VERSION=2 -DBOOST_ASIO_DISABLE_EVENTFD -DBOOST_ASIO_DISABLE_EPOLL    -DTBB_AVAILABLE -O2 -pipe -pthread -fPIC -std=c++98 -fvisibility=hidden -g -D_POSIX_C_SOURCE=199506L -fno-omit-frame-pointer -DNDEBUG -W -Wcast-align -Wall -Wwrite-strings -Wpointer-arith -Wcast-qual -Wno-unused -Woverloaded-virtual -Wnon-virtual-dtor -Wno-ignored-qualifiers

I was also able to work around it by changing the return type of certain optional_base<T> methods (i.e. get_impl()) to 'T attribute((may_alias))&' (or whatever the analogous pointer or reference type is).

Attachments (1)

test_gcc_bug.cpp (1.7 KB) - added by Tony.Astolfi@… 6 years ago.
test case source file

Download all attachments as: .zip

Change History (3)

Changed 6 years ago by Tony.Astolfi@…

Attachment: test_gcc_bug.cpp added

test case source file

comment:1 Changed 6 years ago by Tony.Astolfi@…

Added original test case source file because the wiki formatting messed up the code.

comment:2 Changed 5 years ago by viboes

Description: modified (diff)
Note: See TracTickets for help on using tickets.