[Boost-bugs] [Boost C++ Libraries] #9913: boost::has_complement of enum class does not compile

Subject: [Boost-bugs] [Boost C++ Libraries] #9913: boost::has_complement of enum class does not compile
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2014-04-15 19:36:02


#9913: boost::has_complement of enum class does not compile
-----------------------------------+-------------------------
 Reporter: Nevin Liber <nevin@…> | Owner: johnmaddock
     Type: Bugs | Status: new
Milestone: To Be Determined | Component: type_traits
  Version: Boost 1.55.0 | Severity: Problem
 Keywords: |
-----------------------------------+-------------------------
 (Also filed this as a gcc bug at
 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60852)

 This works under gcc 4.7.2 and clang 3.4, but fails to compile under gcc
 4.9 RC1. enum class seems to be the only issue; plain enums work fine.

 #include <boost/type_traits.hpp>
 #include <iostream>

 enum class E {};

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

 Using Boost 1.55 and 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)
      ^

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/9913>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:16 UTC