Boost logo

Boost :

Subject: [boost] [type traits] has_complement, enum class, and gcc 4.9
From: Nevin Liber (nevin_at_[hidden])
Date: 2014-04-15 15:00:49


We are seeing build problems with gcc 4.9 RC1 and Boost 1.55. Given the
following test program:

#include <boost/type_traits.hpp>

#include <iostream>

enum class E {};

int main()

{ std::cout << boost::has_complement<E>() << std::endl; }

Using g++ -std=c++11, we get:

In file included from */opt/local/include/boost/config.hpp:57:0*,

                 from
*/opt/local/include/boost/type_traits/add_const.hpp:13*,

                 from */opt/local/include/boost/type_traits.hpp:13*,

                 from *a.cpp:1*:

/opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp: In
instantiation of '*const bool
boost::detail::has_complement_impl::operator_exists<E>::value*':

*/opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp:173:4:*
 required from '*const
bool boost::detail::has_complement_impl::trait_impl1<E,
boost::detail::has_complement_impl::dont_care, false>::value*'

*/opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp:195:4:*
 required from '*const
bool boost::detail::has_complement_impl::trait_impl<E,
boost::detail::has_complement_impl::dont_care>::value*'

*/opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp:202:1:*
 required from '*struct
boost::has_complement<E>*'

*a.cpp:7:41:* required from here

*/opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp:152:56:*
*error:
*no match for '*operator~*' (operand type is '*E*')

    BOOST_STATIC_CONSTANT(bool, value = (sizeof(check(((BOOST_TT_TRAIT_OP
make<Rhs>()),make<has_operator>())))==sizeof(::boost::type_traits::yes_type)));

* ^*

/opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp: In
instantiation of '*const bool
boost::detail::has_complement_impl::operator_returns_void<E>::value*':

*/opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp:173:4:*
 required from '*const
bool boost::detail::has_complement_impl::trait_impl1<E,
boost::detail::has_complement_impl::dont_care, false>::value*'

*/opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp:195:4:*
 required from '*const
bool boost::detail::has_complement_impl::trait_impl<E,
boost::detail::has_complement_impl::dont_care>::value*'

*/opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp:202:1:*
 required from '*struct
boost::has_complement<E>*'

*a.cpp:7:41:* required from here

*/opt/local/include/boost/type_traits/detail/has_prefix_operator.hpp:89:102:*
*error:
*no match for '*operator~*' (operand type is '*E*')

    BOOST_STATIC_CONSTANT(bool, value =
(sizeof(::boost::type_traits::yes_type)==sizeof(returns_void((BOOST_TT_TRAIT_OP
make<Rhs>(),returns_void_t())))));

*
                            ^*

*a.cpp:* In function '*int main()*':

*a.cpp:7:41:* *error: *cannot bind '*std::ostream {aka
std::basic_ostream<char>}*' lvalue to '*std::basic_ostream<char>&&*'

 { std::cout << boost::has_complement<E>() << std::endl; }

* ^*

In file included from */opt/local/include/gcc49/c++/istream:39:0*,

                 from */opt/local/include/gcc49/c++/sstream:38*,

                 from */opt/local/include/gcc49/c++/complex:45*,

                 from
*/opt/local/include/boost/type_traits/is_complex.hpp:12*,

                 from */opt/local/include/boost/type_traits.hpp:49*,

                 from *a.cpp:1*:

*/opt/local/include/gcc49/c++/ostream:602:5:* *note: *initializing argument
1 of '*std::basic_ostream<_CharT, _Traits>&
std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with
_CharT = char; _Traits = std::char_traits<char>; _Tp =
boost::has_complement<E>]*'

     operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)

* ^*

It compiles fine under gcc 4.7.2 and clang 3.4. It also compiles fine for
plain enums.

Any ideas?

-- 
 Nevin ":-)" Liber  <mailto:nevin_at_[hidden]>  (847) 691-1404

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk