Boost logo

Boost Users :

Subject: [Boost-users] [intrusive_ptr] Strange ternary op behavior with MSVC14
From: TONGARI J (tongari95_at_[hidden])
Date: 2015-08-11 04:27:39


Hi,

I found a strange bug while debugging:
This is the minimal example that shows the problem:
(the nullptr will be some other meaningful thing in real case)

```c++
#include <iostream>
#include <boost/smart_ptr/intrusive_ptr.hpp>
#include <boost/smart_ptr/intrusive_ref_counter.hpp>

template<class T>
struct wrapper
{
    wrapper() = default;

    wrapper(boost::intrusive_ptr<T> const& p) : _p(p) {}

    boost::intrusive_ptr<T> const& get_ptr() const
    {
#if 0
        // This is OK.
        if (_p)
            return _p;
        return nullptr;
#else
        // Strange behavior.
        return _p ? _p : nullptr;
#endif
    }

private:

    boost::intrusive_ptr<T> _p;
};

struct W : boost::intrusive_ref_counter<W>
{

};

template<class T1, class T2>
inline void test(wrapper<T1> const& s1, wrapper<T2> const& s2)
{
    auto tup = std::make_tuple(s1.get_ptr(), s2.get_ptr());
    std::cout << 0 << ":" << (void*)std::get<0>(tup).get() << "\n";
    std::cout << 1 << ":" << (void*)std::get<1>(tup).get() << "\n";
}

int main()
{
    wrapper<W> a(new W), b(new W);
    test(a, b);
    return 0;
}
```

If compiled with MSVC14, you'll see the 2 addresses are the same while they
shouldn't.
If if-stmt is used instead, the problem won't be shown.
I also replaced intrusive_ptr with std::shared_ptr and the problem isn't
shown as well.
The same code works well with g++.

It seems intrusive_ptr & MSVC14 specific but I can't reason about...

Any idea?



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net