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.

Reply via email to