https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115561

            Bug ID: 115561
           Summary: [14/15 Regression] ICE checking constraints when a
                    local class is involved
           Product: gcc
           Version: 14.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rs2740 at gmail dot com
  Target Milestone: ---

Reduced test case:

template<typename _Tp>
auto declval() noexcept -> _Tp&&;

template<bool, typename _Tp = void>
struct enable_if
{ };

template<typename _Tp>
struct enable_if<true, _Tp>
{ using type = _Tp; };

template<bool _Cond, typename _Tp = void>
using enable_if_t = typename enable_if<_Cond, _Tp>::type;

template<typename _Tp>
struct is_void
{ static constexpr bool value = false;  };

template<typename Fun, typename... Args>
using invoke_result_t =
    decltype(declval<Fun>()(declval<Args>()...));

template<typename R>
using iter_reference_t = decltype(*declval<R &>());

struct iter_move_fn
{
    template<typename I>
    constexpr
    auto operator() (I &&i)  -> void;
} iter_move;

template<typename I>
using iter_rvalue_reference_t = decltype(iter_move(declval<I &>()));

template<class, class>
concept same_as = true;

template<typename I>
concept readable_concept_ =
        same_as<iter_rvalue_reference_t<I const>, iter_rvalue_reference_t<I>>;

template<typename I>
concept indirectly_readable =
    readable_concept_<enable_if_t<true, I>>;

template<typename Fun, typename I>
using indirect_result_t =
    enable_if_t<indirectly_readable<I>,
                        invoke_result_t<Fun, iter_reference_t<I>>>;

template<typename I, typename Fun>
concept transformable =
   (!is_void<indirect_result_t<Fun &, I>>::value);

template<typename I, typename Fun >
    requires transformable<I, Fun>
constexpr void transform(I, Fun)
{
}

void foo()
{
    struct B {};
    (void) transform((B*)nullptr, [](B) {return 0; });
}

With GCC 14.1, g++ -std=c++20 crashes:

test2.cpp: In substitution of ‘template<class I, class Fun>  requires 
transformable<I, Fun> constexpr void transform(I, Fun) [with I = foo()::B*; Fun
= foo()::<lambda(foo()::B)>]’:
test2.cpp:65:21:   required from here
   65 |     (void) transform((B*)nullptr, [](B) {return 0; });
      |            ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
test2.cpp:34:51: internal compiler error: Segmentation fault
   34 | using iter_rvalue_reference_t = decltype(iter_move(declval<I &>()));
      |                                          ~~~~~~~~~^~~~~~~~~~~~~~~~
0xe9ea2f crash_signal
        ../../gcc/toplev.cc:319
0x8fc014 finish_call_expr(tree_node*, vec<tree_node*, va_gc, vl_embed>**, bool,
bool, int)
        ../../gcc/cp/semantics.cc:2971
0x8c9cd7 tsubst_expr(tree_node*, tree_node*, int, tree_node*)
        ../../gcc/cp/pt.cc:21081
0x8ce166 tsubst(tree_node*, tree_node*, int, tree_node*)
        ../../gcc/cp/pt.cc:16929
0x8cf7a4 tsubst_template_args(tree_node*, tree_node*, int, tree_node*)
        ../../gcc/cp/pt.cc:13923
0x77dfbf normalize_concept_check
        ../../gcc/cp/constraint.cc:761
0x77dfbf normalize_atom
        ../../gcc/cp/constraint.cc:816
0x77dfbf normalize_expression
        ../../gcc/cp/constraint.cc:886
0x77e5f1 normalize_concept_check
        ../../gcc/cp/constraint.cc:795
0x77e5f1 normalize_atom
        ../../gcc/cp/constraint.cc:816
0x77e5f1 normalize_expression
        ../../gcc/cp/constraint.cc:886
0x780070 get_normalized_constraints
        ../../gcc/cp/constraint.cc:898
0x780070 normalize_concept_definition
        ../../gcc/cp/constraint.cc:1016
0x780070 satisfy_nondeclaration_constraints
        ../../gcc/cp/constraint.cc:3225
0x780070 constraint_satisfaction_value
        ../../gcc/cp/constraint.cc:3411
0x78275e evaluate_concept_check(tree_node*)
        ../../gcc/cp/constraint.cc:3459
0x76d7e3 cxx_eval_constant_expression
        ../../gcc/cp/constexpr.cc:8519
0x7740b7 cxx_eval_outermost_constant_expr
        ../../gcc/cp/constexpr.cc:8857
0x777bd5 maybe_constant_value(tree_node*, tree_node*, mce_value)
        ../../gcc/cp/constexpr.cc:9145
0x8cada4 convert_nontype_argument
        ../../gcc/cp/pt.cc:7521

Also crashes on godbolt GCC trunk. GCC 13.2 compiles this OK. Moving the
definition of struct B to global scope makes the crash go away.

Reply via email to