// PR c++/66387 // { dg-do compile { target c++14 } } namespace boost { namespace hana { namespace detail { namespace std { using size_t = decltype(0); } } namespace ic_detail { template struct _with_index { template constexpr void operator()(F &&) const; }; template struct _times { _with_index with_index; }; } template struct _integral_constant { using value_type = T; operator value_type() const; ic_detail::_times times; }; template constexpr _integral_constant size_t{}; template struct datatype; } } namespace std { typedef int size_t; inline namespace __cxx11 {} } namespace boost { namespace hana { template struct when; template struct to_impl; template struct datatype : datatype> {}; template struct datatype> { using type = typename T::hana::datatype; }; template struct _models; template struct to_impl < To, From, when < _models { } >> ; namespace detail { namespace std { template struct integer_sequence; template using index_sequence = integer_sequence; namespace int_seq_detail { template struct make_index_sequence { using type = index_sequence<0>; }; template struct cast_to; template struct cast_to> { using type = integer_sequence; }; } template using make_integer_sequence = typename int_seq_detail::cast_to< T, int_seq_detail::make_index_sequence<1>::type>::type; } } namespace ic_detail { template > struct go; template struct go> { using swallow = T; template static void with_index(F f) { swallow{(f(_integral_constant{}), 0)...}; } }; template template constexpr void _with_index::operator()(F &&f) const { go::with_index(f); } } } } namespace std { template class allocator; template struct char_traits; template > class basic_ostream; namespace __cxx11 { template , typename = allocator<_CharT>> class basic_stringstream; } typedef basic_ostream ostream; typedef basic_stringstream stringstream; template class basic_ostream {}; template class basic_iostream : public basic_ostream<_CharT> {}; namespace __cxx11 { template class basic_stringstream : public basic_iostream<_CharT, _Traits> {}; } } namespace hana = boost::hana; template struct print_impl; template void print(std::ostream os, X x) { using Tag = typename hana::datatype::type; print_impl::apply(os, x); } struct Vector; template struct vector2 { struct hana { using datatype = Vector; }; static constexpr std::size_t size = 0; }; template <> struct print_impl { template static void apply(std::ostream, vectorN) { constexpr auto N = hana::size_t; N.times.with_index([&](auto) { N - hana::size_t<1>; }); } }; int main() { std::stringstream ss; vector2 v2; print(ss, v2); }