Boost logo

Boost Users :

Subject: [Boost-users] [MPL] HAS_XXX gives the wrong answer after "enable_if" on incomplete type in GCC 4.6/7
From: Duncan Exon Smith (duncanphilipnorman_at_[hidden])
Date: 2012-12-18 16:14:50


I've run into an unexpected behaviour, and I'm not sure if the
compiler has a bug, if Boost.MPL has a bug, or if I have the wrong
expectations. I am using Boost v1.49.0, but I also tested r82084 of
the Boost trunk.

In particular, I have:

BOOST_MPL_HAS_XXX_TRAIT_DEF(trait)
// skipping important code here
struct traitor_1 { typedef void *trait; };
struct traitor_2 { typedef void *trait; };
static_assert(has_trait<traitor_1>::value, "traitor_1::trait is missing");
static_assert(has_trait<traitor_2>::value, "traitor_2::trait is missing");

and the compiler tells me that "has_trait<traitor_1>::value" is
"false", while "has_trait<traitor_2>::value" is "true". The above
listing skips some key code involving boost::enable_if that appears to
break "has_trait". The full listing is below.

I would appreciate if any experts could tell me if this behaviour is
expected. The complete code listing is below. I've tried:
 g++-4.6 -std=gnu++0x -I/usr/include/boost-1_49 -c -o/dev/null traitor.cpp
 g++-4.7 -std=gnu++0x -I/usr/include/boost-1_49 -c -o/dev/null traitor.cpp

Thanks very much,
Duncan

// traitor.cpp
# include <boost/utility/enable_if.hpp>
# include <boost/mpl/has_xxx.hpp>

BOOST_MPL_HAS_XXX_TRAIT_DEF(trait)

class C
{
    struct enabler { };
public:
    template <class T> C(const T &,
                         typename boost::enable_if<has_trait<T>,
enabler>::type = enabler());
};

struct traitor_1;

void g(const C &);
void g(const traitor_1 &);
void f(const traitor_1 &t1)
{ g(t1); }

struct traitor_1 { typedef void *trait; };
struct traitor_2 { typedef void *trait; };

static_assert(has_trait<traitor_1>::value, "traitor_1::trait is missing");
static_assert(has_trait<traitor_2>::value, "traitor_2::trait is missing");


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