https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86574
Bug ID: 86574 Summary: ICE on std::prev with ranges::view::transform Product: gcc Version: 9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: tower120 at gmail dot com Target Milestone: --- The following code cause ICE on gcc 9. And have malfunction build on all previous versions (program compiles, but hangs); clang compiles with error about bidirectional iterator. https://wandbox.org/permlink/bPT0llOGPqouv3CM #include <iostream> #include <vector> #include <range/v3/view/transform.hpp> struct Data{ int x,y; }; int main() { std::vector<Data> datas = { Data{0,1}, Data{1,2}, Data{1,3} }; const auto xs = datas | ranges::view::transform([](const Data& data) -> int{ return data.x; }); // no compiler errors / ICEs, but assembled executable - malfunction - // program hungs, as soon as reach std::prev //auto j = std::prev(xs.end()); auto j = std::prev(xs.end(), 1); std::cout << "Done" << std::endl; return 0; } Error message: In file included from /opt/wandbox/range-v3/include/range/v3/view/transform.hpp:26, from prog.cc:3: /opt/wandbox/range-v3/include/range/v3/view_adaptor.hpp: In instantiation of 'constexpr ranges::v3::adaptor_cursor<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, ranges::v3::indirected<main()::<lambda(const Data&)> > >::adaptor<true> >::adaptor_cursor(Args&& ...) [with Args = {__gnu_cxx::__normal_iterator<Data*, std::vector<Data, std::allocator<Data> > >, ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, ranges::v3::indirected<main()::<lambda(const Data&)> > >::adaptor<true>}; typename meta::v1::detail::_if_<meta::v1::list<std::is_same<std::integer_sequence<bool, std::is_constructible<Ts, Args>::type::value ...>, std::integer_sequence<bool, (std::is_constructible<Ts, Args>::type::value) || true ...> >, int>, std::integral_constant<bool, true> >::type <anonymous> = 0][inherited from ranges::v3::compressed_tuple_detail::compressed_tuple_<meta::v1::list<__gnu_cxx::__normal_iterator<Data*, std::vector<Data, std::allocator<Data> > >, ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, ranges::v3::indirected<main()::<lambda(const Data&)> > >::adaptor<true> >, std::integer_sequence<long unsigned int, 0, 1> >]': /opt/wandbox/range-v3/include/range/v3/view_adaptor.hpp:183:16: required from 'constexpr ranges::v3::adaptor_cursor<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, ranges::v3::indirected<main()::<lambda(const Data&)> > >::adaptor<true> >::adaptor_cursor(Args&& ...) [with Args = {__gnu_cxx::__normal_iterator<Data*, std::vector<Data, std::allocator<Data> > >, ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, ranges::v3::indirected<main()::<lambda(const Data&)> > >::adaptor<true>}; typename meta::v1::detail::_if_<meta::v1::list<std::is_same<std::integer_sequence<bool, std::is_constructible<Ts, Args>::type::value ...>, std::integer_sequence<bool, (std::is_constructible<Ts, Args>::type::value) || true ...> >, int>, std::integral_constant<bool, true> >::type <anonymous> = 0][inherited from ranges::v3::compressed_tuple_detail::compressed_tuple_<meta::v1::list<__gnu_cxx::__normal_iterator<Data*, std::vector<Data, std::allocator<Data> > >, ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, ranges::v3::indirected<main()::<lambda(const Data&)> > >::adaptor<true> >, std::integer_sequence<long unsigned int, 0, 1> >]' /opt/wandbox/range-v3/include/range/v3/view_adaptor.hpp:405:63: required from 'static constexpr ranges::v3::adaptor_cursor_t<D> ranges::v3::view_adaptor<Derived, BaseRng, C>::begin_cursor_(D&) [with D = const ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, ranges::v3::indirected<main()::<lambda(const Data&)> > >; Derived = ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, ranges::v3::indirected<main()::<lambda(const Data&)> > >; BaseRng = ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >; ranges::v3::cardinality Cardinality = (ranges::v3::cardinality)-1; ranges::v3::adaptor_cursor_t<D> = ranges::v3::adaptor_cursor<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, ranges::v3::indirected<main()::<lambda(const Data&)> > >::adaptor<true> >; typename std::decay<decltype (ranges::v3::range_access::begin_adaptor(declval<D&>(), 42))>::type = ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, ranges::v3::indirected<main()::<lambda(const Data&)> > >::adaptor<true>; typename std::decay<decltype (declval<typename std::decay<decltype (ranges::v3::range_access::begin_adaptor(declval<D&>(), 42))>::type>().begin(declval<D&>()))>::type = __gnu_cxx::__normal_iterator<Data*, std::vector<Data> >]' /opt/wandbox/range-v3/include/range/v3/view_adaptor.hpp:423:13: required by substitution of 'template<class D, bool _concept_requires_421, typename std::enable_if<(_concept_requires_421 || (typename ranges::v3::concepts::Same::same<C, ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data, std::allocator<Data> > >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data, std::allocator<Data> > > >, ranges::v3::indirected<main()::<lambda(const Data&)> > > >::type() && ranges::v3::concepts::models<ranges::v3::concepts::Range, const ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data, std::allocator<Data> > >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data, std::allocator<Data> > > > >())), void>::type* <anonymous> > constexpr decltype (ranges::v3::view_adaptor<ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, ranges::v3::indirected<main()::<lambda(const Data&)> > >, ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, (ranges::v3::cardinality)-1>::begin_cursor_<D>(declval<const D&>())) ranges::v3::view_adaptor<ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, ranges::v3::indirected<main()::<lambda(const Data&)> > >, ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, (ranges::v3::cardinality)-1>::begin_cursor<D, _concept_requires_421, <enumerator> >() const [with D = ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, ranges::v3::indirected<main()::<lambda(const Data&)> > >; bool _concept_requires_421 = false; typename std::enable_if<(_concept_requires_421 || (typename ranges::v3::concepts::Same::same<C, ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data, std::allocator<Data> > >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data, std::allocator<Data> > > >, ranges::v3::indirected<main()::<lambda(const Data&)> > > >::type() && ranges::v3::concepts::models<ranges::v3::concepts::Range, const ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data, std::allocator<Data> > >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data, std::allocator<Data> > > > >())), void>::type* <anonymous> = 0]' /opt/wandbox/range-v3/include/range/v3/range_access.hpp:178:48: required by substitution of 'template<class Rng> static constexpr decltype (static_cast<const Rng&>(rng).begin_cursor()) ranges::v3::range_access::begin_cursor(Rng&, int) [with Rng = const ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, ranges::v3::indirected<main()::<lambda(const Data&)> > >]' /opt/wandbox/range-v3/include/range/v3/view_facade.hpp:35:68: required by substitution of 'template<class Derived> using facade_sentinel_t = meta::v1::if_<typename ranges::v3::concepts::Same::same<typename std::decay<decltype (ranges::v3::range_access::begin_cursor(declval<Derived&>(), 42))>::type, typename std::decay<decltype (ranges::v3::range_access::end_cursor(declval<Derived&>(), 42))>::type>::type, ranges::v3::basic_iterator<typename std::decay<decltype (ranges::v3::range_access::begin_cursor(declval<Derived&>(), 42))>::type>, typename std::decay<decltype (ranges::v3::range_access::end_cursor(declval<Derived&>(), 42))>::type> [with Derived = const ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, ranges::v3::indirected<main()::<lambda(const Data&)> > >]' /opt/wandbox/range-v3/include/range/v3/view_facade.hpp:111:48: required by substitution of 'template<class D, bool _concept_requires_110, typename std::enable_if<(_concept_requires_113 || typename ranges::v3::concepts::Same::same<C, ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data, std::allocator<Data> > >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data, std::allocator<Data> > > >, ranges::v3::indirected<main()::<lambda(const Data&)> > > >::type()), void>::type* <anonymous> > ranges::v3::detail::facade_sentinel_t<const D> ranges::v3::view_facade<ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, ranges::v3::indirected<main()::<lambda(const Data&)> > >, (ranges::v3::cardinality)-1>::end<D, _concept_requires_110, <enumerator> >() const [with D = ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data> >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data> > >, ranges::v3::indirected<main()::<lambda(const Data&)> > >; bool _concept_requires_110 = false; typename std::enable_if<(_concept_requires_113 || typename ranges::v3::concepts::Same::same<C, ranges::v3::iter_transform_view<ranges::v3::iterator_range<__gnu_cxx::__normal_iterator<Data*, std::vector<Data, std::allocator<Data> > >, __gnu_cxx::__normal_iterator<Data*, std::vector<Data, std::allocator<Data> > > >, ranges::v3::indirected<main()::<lambda(const Data&)> > > >::type()), void>::type* <anonymous> = 0]' prog.cc:16:31: required from here /opt/wandbox/range-v3/include/range/v3/view_adaptor.hpp:183:16: internal compiler error: in tsubst_pack_expansion, at cp/pt.c:12200 struct adaptor_cursor ^~~~~~~~~~~~~~ 0x589b33 tsubst_pack_expansion(tree_node*, tree_node*, int, tree_node*) ../../source/gcc/cp/pt.c:12200 0x6af1b2 tsubst_template_args ../../source/gcc/cp/pt.c:12433 0x6af06c tsubst_template_args ../../source/gcc/cp/pt.c:12451 0x6b1f28 tsubst_aggr_type ../../source/gcc/cp/pt.c:12664 0x6a607b tsubst(tree_node*, tree_node*, int, tree_node*) ../../source/gcc/cp/pt.c:14285 0x6af182 tsubst_template_args ../../source/gcc/cp/pt.c:12462 0x6b1f28 tsubst_aggr_type ../../source/gcc/cp/pt.c:12664 0x6a607b tsubst(tree_node*, tree_node*, int, tree_node*) ../../source/gcc/cp/pt.c:14285 0x6b55a5 tsubst_qualified_id ../../source/gcc/cp/pt.c:15176 0x6b6658 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../source/gcc/cp/pt.c:18032 0x6bb9ad tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool, bool) ../../source/gcc/cp/pt.c:17727 0x6bb9ad maybe_instantiate_noexcept(tree_node*, int) ../../source/gcc/cp/pt.c:23655 0x609c4c start_preparsed_function(tree_node*, tree_node*, int) ../../source/gcc/cp/decl.c:15296 0x64e991 synthesize_method(tree_node*) ../../source/gcc/cp/method.c:913 0x6a8404 instantiate_decl(tree_node*, bool, bool) ../../source/gcc/cp/pt.c:24056 0x5e25eb instantiate_cx_fn_r ../../source/gcc/cp/constexpr.c:4862 0xd6850b walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, default_hash_traits<tree_node*> >*, tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, default_hash_traits<tree_node*> >*)) ../../source/gcc/tree.c:11422 0xd6880d walk_tree_1(tree_node**, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, default_hash_traits<tree_node*> >*, tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, default_hash_traits<tree_node*> >*)) ../../source/gcc/tree.c:11740 0xd681a0 walk_tree_without_duplicates_1(tree_node**, tree_node* (*)(tree_node**, int*, void*), void*, tree_node* (*)(tree_node**, int*, tree_node* (*)(tree_node**, int*, void*), void*, hash_set<tree_node*, default_hash_traits<tree_node*> >*)) ../../source/gcc/tree.c:11766 0x5e98dd instantiate_constexpr_fns ../../source/gcc/cp/constexpr.c:4881 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions.