boostorg/hana

140 failing unit tests on develop

bebuch opened this issue · 6 comments

With both clang and GCC I have 140 failing unit tests on the develop branch. Its always somthing like:

    "g++-6"   -fPIC -m64 -O0 -fno-inline -Wall -g -std=gnu++1z -DBOOST_ALL_NO_LIB=1  -I"../../.." -I"../include" -I"_include" -c -o "../../../bin.v2/libs/hana/test/test~ext~boost~fusion~deque~auto~at.test/gcc-6/debug/ext/boost/fusion/deque/auto/at.o" "ext/boost/fusion/deque/auto/at.cpp"

...failed gcc.compile.c++ ../../../bin.v2/libs/hana/test/test~ext~boost~fusion~deque~auto~at.test/gcc-6/debug/ext/boost/fusion/deque/auto/at.o...
...skipped <p../../../bin.v2/libs/hana/test/test~ext~boost~fusion~deque~auto~at.test/gcc-6/debug>test~ext~boost~fusion~deque~auto~at for lack of <p../../../bin.v2/libs/hana/test/test~ext~boost~fusion~deque~auto~at.test/gcc-6/debug>ext/boost/fusion/deque/auto/at.o...
...skipped <p../../../bin.v2/libs/hana/test/test~ext~boost~fusion~deque~auto~at.test/gcc-6/debug>test~ext~boost~fusion~deque~auto~at.run for lack of <p../../../bin.v2/libs/hana/test/test~ext~boost~fusion~deque~auto~at.test/gcc-6/debug>test~ext~boost~fusion~deque~auto~at...
gcc.compile.c++ ../../../bin.v2/libs/hana/test/test~ext~boost~fusion~deque~auto~any_of.test/gcc-6/debug/ext/boost/fusion/deque/auto/any_of.o
In file included from ../../../boost/type_traits/is_convertible.hpp:20:0,
                 from ../../../boost/type_traits/is_empty.hpp:12,
                 from ../../../boost/mpl/empty_base.hpp:23,
                 from ../../../boost/fusion/sequence/intrinsic/at.hpp:15,
                 from ../../../boost/hana/ext/boost/fusion/detail/common.hpp:22,
                 from ../../../boost/hana/ext/boost/fusion/deque.hpp:16,
                 from ext/boost/fusion/deque/auto/_specs.hpp:8,
                 from ext/boost/fusion/deque/auto/any_of.cpp:5:
../../../boost/type_traits/is_convertible.hpp: In instantiation of ‘struct boost::is_convertible<boost::hana::ext::boost::fusion::deque_tag, boost::fusion::detail::from_sequence_convertible_type>’:
../../../boost/mpl/aux_/nested_type_wknd.hpp:26:31:   required from ‘struct boost::mpl::aux::nested_type_wknd<boost::is_convertible<boost::hana::ext::boost::fusion::deque_tag, boost::fusion::detail::from_sequence_convertible_type> >’
../../../boost/mpl/not.hpp:39:8:   required from ‘struct boost::mpl::not_<boost::is_convertible<boost::hana::ext::boost::fusion::deque_tag, boost::fusion::detail::from_sequence_convertible_type> >’
../../../boost/mpl/aux_/nested_type_wknd.hpp:26:31:   required from ‘struct boost::mpl::aux::nested_type_wknd<boost::mpl::not_<boost::is_convertible<boost::hana::ext::boost::fusion::deque_tag, boost::fusion::detail::from_sequence_convertible_type> > >’
../../../boost/mpl/aux_/preprocessed/gcc/and.hpp:48:8:   required from ‘struct boost::mpl::and_<boost::mpl::not_<boost::is_convertible<boost::hana::ext::boost::fusion::deque_tag, boost::fusion::detail::from_sequence_convertible_type> >, boost::mpl::is_sequence<boost::hana::ext::boost::fusion::deque_tag>, mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> >’
../../../boost/fusion/support/detail/is_mpl_sequence.hpp:21:12:   [ skipping 2 instantiation contexts, use -ftemplate-backtrace-limit=0 to disable ]
../../../boost/fusion/support/tag_of.hpp:52:16:   required from ‘struct boost::fusion::detail::tag_of_impl<boost::hana::ext::boost::fusion::deque_tag, void>’
../../../boost/fusion/support/tag_of.hpp:70:16:   required from ‘struct boost::fusion::traits::tag_of<boost::hana::ext::boost::fusion::deque_tag, void>’
../../../boost/hana/core/tag_of.hpp:22:12:   required from ‘struct boost::hana::tag_of<boost::hana::ext::boost::fusion::deque_tag, void>’
../../../boost/hana/concept/searchable.hpp:27:13:   required from ‘struct boost::hana::Searchable<boost::hana::ext::boost::fusion::deque_tag>’
../../../boost/hana/any_of.hpp:41:10:   required from ‘constexpr auto boost::hana::any_of_t::operator()(Xs&&, Pred&&) const [with Xs = boost::fusion::deque<>; Pred = <lambda()>::<lambda(auto:2)>]’
_include/auto/any_of.hpp:22:5:   required from here
../../../boost/static_assert.hpp:31:45: error: static assertion failed: From argument type to is_convertible must be a complete type
 #     define BOOST_STATIC_ASSERT_MSG( ... ) static_assert(__VA_ARGS__)
                                             ^
../../../boost/type_traits/is_convertible.hpp:484:4: note: in expansion of macro ‘BOOST_STATIC_ASSERT_MSG’
    BOOST_STATIC_ASSERT_MSG(boost::is_complete<From>::value || boost::is_void<From>::value || boost::is_array<From>::value, "From argument type to is_convertible must be a complete type");
    ^~~~~~~~~~~~~~~~~~~~~~~

The From is a Hana-Tag struct (boost::hana::ext::boost::fusion::deque_tag in this case) which is not complete. (BTW: Are Hana-Tags required to be compete? The documentation does not mention this explicitly, but in the examples they are not.)

Hana tags should not be required to be complete. I can't reproduce locally using the classic CMake workflow and Boost 1.65.1. Also, Travis CI does not report any failure. Can you please provide a minimal complete example of how you're setting up Hana to reproduce?

I used bjam in the test directory to compile the tests.

$ bjam toolset=gcc
$ bjam toolset=clang

I can reproduce it with a newly checked-out repository:

git clone --recursive "https://github.com/boostorg/boost.git" modular-boost
cd modular-boost
git checkout develop
git submodule foreach git checkout develop
./bootstrap.sh
./b2 headers
PATH=$(pwd):$PATH
cd libs/hana/test/
bjam toolset=gcc -j 8

I could not reproduce locally, even with your instructions, but now I just saw it fail on Travis: https://travis-ci.org/boostorg/hana/jobs/346757876. I'll look into that.

I believe this is a Fusion bug. I am able to reproduce with this:

#include <boost/fusion/include/tag_of.hpp>
struct incomplete;
using X = ::boost::fusion::traits::tag_of<incomplete>::type

int main() { }

My guess is that Fusion used to accept incomplete types in tag_of, but they don't anymore.

Ok, I believe this started happening in boostorg/type_traits@ac35139. Presumably, fusion::tag_of using a type trait that requires the input type to be complete, but it does not check for that (and it doesn't document that the input of tag_of must be complete AFAICT).

This should have been fixed in Fusion now. Thanks a lot for reporting, this could have been a big breakage.