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.

Reply via email to