https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91930
Bug ID: 91930 Summary: [10 Regression] internal compiler error: in lazily_declare_fn, at cp/method.c:2423 with -fconcepts Product: gcc Version: 10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: mpolacek at gcc dot gnu.org Target Milestone: --- Trying to compile range-v3 with current trunk turned up this ICE. Started with r274534. namespace std { template <typename _Tp, _Tp __v> struct A { static constexpr _Tp value = __v; }; template <bool __v> using __bool_constant = A<bool, __v>; auto declval(); struct B { template <typename> static __bool_constant<noexcept(declval)> __test(int); }; template <typename _Tp> struct __is_nt_destructible_impl : B { typedef decltype(__test<_Tp>(0)) type; }; template <typename> struct is_nothrow_destructible : __is_nt_destructible_impl<int>::type {}; } // namespace std namespace meta { namespace detail { template <class T, T> struct require_constant; } template <typename T> concept trait = requires { typename detail::require_constant<decltype(T()), {}>; }; template <trait T> using _t = T::type; } // namespace meta template <typename T> concept destructible = std::is_nothrow_destructible<T>::value; template <typename T> concept constructible_from = destructible<T>; template <typename T> concept default_constructible = constructible_from<T>; namespace ranges { template <typename T> struct static_const { static constexpr T value{}; }; namespace detail { int as_const; template <typename> using as_const_t = decltype(as_const); } // namespace detail template <typename> struct G; namespace detail { template <typename> struct C; } template <typename I> using reverse_iterator = G<detail::C<I>>; struct range_access { template <typename T> static T::mixin mixin_base_2_(int); template <typename Cur> struct mixin_base_ { using type = decltype(mixin_base_2_<Cur>(2)); }; template <typename Cur> using mixin_base_t = meta::_t<mixin_base_<Cur>>; auto read(); }; template <typename> concept readable_cursor = requires { range_access::read; }; template <typename T> struct basic_mixin { basic_mixin() requires default_constructible<T>; }; namespace detail { template <typename Cur, bool> struct H : range_access::mixin_base_t<Cur> { using range_access::mixin_base_t<Cur>::mixin_base_t; }; template <typename Cur> using iterator_associated_types_base = H<Cur, readable_cursor<Cur>>; } // namespace detail template <typename Cur> struct G : detail::iterator_associated_types_base<Cur> {}; namespace detail { template <typename> struct C { struct mixin : basic_mixin<C> { using basic_mixin<C>::basic_mixin; }; }; } // namespace detail namespace _rbegin_ { struct fn { struct D { template <typename R> auto operator()(R r) noexcept(noexcept(r.rbegin())) {} }; template <typename> using impl = D; template <typename R> auto operator()(R r) noexcept(noexcept(impl<R>{}(r))) {} }; template <typename> using _t = decltype(fn{}); } // namespace _rbegin_ auto rbegin = static_const<_rbegin_::fn>::value; namespace _crbegin_ { struct fn { template <typename R> _rbegin_::_t<detail::as_const_t<R>> operator()(R r) noexcept(noexcept(rbegin(r))); }; } // namespace _crbegin_ auto crbegin = static_const<_crbegin_::fn>::value; } // namespace ranges struct F { using value_type = int; using const_iterator = value_type; using const_reverse_iterator = ranges::reverse_iterator<const_iterator>; const_reverse_iterator rbegin(); }; template <typename Sequence1234> auto test_crits(Sequence1234 a) { ranges::crbegin(a); } auto test_array() { F a; test_crits(a); } $ ./cc1plus -quiet r.C -std=c++2a -fconcepts r.C: In instantiation of ‘struct ranges::detail::H<ranges::detail::C<int>, false>’: r.C:59:8: required from ‘struct ranges::G<ranges::detail::C<int> >’ r.C:70:74: required from ‘auto ranges::_rbegin_::fn::D::operator()(R) [with R = F]’ r.C:73:73: required from ‘auto ranges::_rbegin_::fn::operator()(R) [with R = F]’ r.C:82:43: required from ‘ranges::_rbegin_::_t<ranges::detail::as_const_t<R> > ranges::_crbegin_::fn::operator()(R) [with R = F; ranges::_rbegin_::_t<ranges::detail::as_const_t<R> > = ranges::_rbegin_::fn]’ r.C:95:18: required from ‘auto test_crits(Sequence1234) [with Sequence1234 = F]’ r.C:100:15: required from here r.C:53:42: internal compiler error: in lazily_declare_fn, at cp/method.c:2423 53 | using range_access::mixin_base_t<Cur>::mixin_base_t; | ^~~~~~~~~~~~ 0xa16904 lazily_declare_fn(special_function_kind, tree_node*) /home/marek/src/gcc/gcc/cp/method.c:2423 0xa1cfdf get_class_binding(tree_node*, tree_node*, bool) /home/marek/src/gcc/gcc/cp/name-lookup.c:1286 0xb4431c lookup_field_r /home/marek/src/gcc/gcc/cp/search.c:990 0xb45736 dfs_walk_all(tree_node*, tree_node* (*)(tree_node*, void*), tree_node* (*)(tree_node*, void*), void*) /home/marek/src/gcc/gcc/cp/search.c:1430 0xb44b26 lookup_member(tree_node*, tree_node*, int, bool, int, access_failure_info*) /home/marek/src/gcc/gcc/cp/search.c:1144 0xa2a533 do_class_using_decl(tree_node*, tree_node*) /home/marek/src/gcc/gcc/cp/name-lookup.c:4651 0xae6c8f tsubst_decl /home/marek/src/gcc/gcc/cp/pt.c:13720 0xae9b5a tsubst(tree_node*, tree_node*, int, tree_node*) /home/marek/src/gcc/gcc/cp/pt.c:14398 0xad9165 instantiate_class_template_1 /home/marek/src/gcc/gcc/cp/pt.c:11284 0xad9c90 instantiate_class_template(tree_node*) /home/marek/src/gcc/gcc/cp/pt.c:11540 0xba54a4 complete_type(tree_node*) /home/marek/src/gcc/gcc/cp/typeck.c:139 0xba54c9 complete_type_or_maybe_complain(tree_node*, tree_node*, int) /home/marek/src/gcc/gcc/cp/typeck.c:151 0xba5567 complete_type_or_else(tree_node*, tree_node*) /home/marek/src/gcc/gcc/cp/typeck.c:168 0x9699ba xref_basetypes(tree_node*, tree_node*) /home/marek/src/gcc/gcc/cp/decl.c:14515 0xad7e1d instantiate_class_template_1 /home/marek/src/gcc/gcc/cp/pt.c:11151 0xad9c90 instantiate_class_template(tree_node*) /home/marek/src/gcc/gcc/cp/pt.c:11540 0xba54a4 complete_type(tree_node*) /home/marek/src/gcc/gcc/cp/typeck.c:139 0xba54c9 complete_type_or_maybe_complain(tree_node*, tree_node*, int) /home/marek/src/gcc/gcc/cp/typeck.c:151 0xba5127 require_complete_type_sfinae(tree_node*, int) /home/marek/src/gcc/gcc/cp/typeck.c:95 0x88ca0d build_cxx_call(tree_node*, int, tree_node**, int, tree_node*) /home/marek/src/gcc/gcc/cp/call.c:9201 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.