Boost logo

Boost Users :

From: Zeljko Vrba (zvrba_at_[hidden])
Date: 2007-06-03 15:08:20

The following simple program crashes with assertion failure when compiled under
Solaris 11 with SunCC: Sun C++ 5.8 Patch 121018-10 2007/02/21

Assertion failed: node_algorithms::unique(to_insert),
file boost/boost/intrusive/list.hpp, line 168

I'm using the latest Boost.Intrusive from CVS (snapshot taken 2007-06-03).
I have tracked the problem, but I don't know wheter it's the code or compiler
problem; see below the code for cause.

== Begin code
// Program to demonstrate a bug with SunCC and member hooks.
#include <boost/intrusive/list.hpp>
struct klass {
    void *data_klass;
    boost::intrusive::list_member_hook<> hook_;
    typedef boost::intrusive::list<
            klass, &klass::hook_>,
        false> list;
static klass Gd;
static klass::list Gl;
int main(void)
=> Gl.push_back(Gd);
    return 0;
== End code

When the program is started, the hook's prev_ and next_ members are initialized
correctly to &Gd.hook_ (0x8062dd8). The member_value_traits instance is by dbx
resolved to

  Corresponds to the template P parameter.

The statement MemberHookType* result = &(value.*P);

sets result to 0x8062dd4 (4 bytes off from the hooks address). Finally, in
push_back method, the to_insert value receives 0x8062dd4 which equals &Gd
(ie. it points to the start of the object) instead of &Gd.hook_.

Should this be reported as a compiler bug?

BTW, I'll try using base hooks as a workaround.

(PS: the code works fine with gcc4.2)

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at