[type traits] has_complement, enum class, and gcc 4.9

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@eviloverlord.com> (847) 691-1404

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; }
does it compiles if: - the enum class is not empty? Try to add a=0 for example (the standard says: "If the enumerator-list is empty, the underlying type is as if the enumeration had a single enumerator with value 0" - you specify the underlying type with ": int", which is the normal underlying type for empty enum class? Frédéric

On 21 April 2014 01:26, Frédéric Bron <frederic.bron@m4x.org> wrote:
does it compiles if: - the enum class is not empty?
No, it still fails to compile. It doesn't matter whether or not the enum class is empty nor if the underlying type is specified. More details at: Stack Overflow: http://stackoverflow.com/questions/23108590/enum-class-and-global-operator-o... gcc: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60852 clang: http://llvm.org/bugs/show_bug.cgi?id=19452 I opened a Trac ticket at https://svn.boost.org/trac/boost/ticket/9913. -- Nevin ":-)" Liber <mailto:nevin@eviloverlord.com> (847) 691-1404
participants (2)
-
Frédéric Bron
-
Nevin Liber