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

            Bug ID: 120062
           Summary: ICE in perform_implicit_conversion_flags when using
                    std::apply with forwarding lambda and function passed
                    to itself
           Product: gcc
           Version: 15.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mario.rodriguezb1 at um dot es
  Target Milestone: ---

It gives ICE only when using flag -std=c++2a, c++ 20 or c++23.

Program:

```
#include <tuple>
#include <iostream>
constexpr auto apply(auto&& func, auto&&... args)
  -> decltype(
    std::apply(
      [](auto&& f, auto&&...args) -> decltype(auto) {
        return f(std::forward<decltype(f)>(f), args...);
      },
      std::tuple(std::forward<decltype(func)>(func),
std::forward<decltype(args)>(args)...)
    )
  )
{

}
constexpr auto add(int x, int y){
        return x + y;
}
int main()
{
        apply(add, 1, 2);
}
```

It gives different stack traces depending on g++ version, on 15.1:

```
internal compiler error: error reporting routines re-entered.
0x228730d diagnostic_context::report_diagnostic(diagnostic_info*)
        ???:0
0x2287465 diagnostic_context::diagnostic_impl(rich_location*,
diagnostic_metadata const*, diagnostic_option_id, char const*, __va_list_tag
(*) [1], diagnostic_t)
        ???:0
0x2297c92 permerror(rich_location*, char const*, ...)
        ???:0
0x7f9f3c perform_implicit_conversion_flags(tree_node*, tree_node*, int, int)
        ???:0
0xa1af5a cp_build_function_call_vec(tree_node*, vec<tree_node*, va_gc,
vl_embed>**, int, tree_node*)
        ???:0
0x9d88a2 finish_call_expr(tree_node*, vec<tree_node*, va_gc, vl_embed>**, bool,
bool, int)
        ???:0
0x99f62f instantiate_decl(tree_node*, bool, bool)
        ???:0
0x894821 maybe_instantiate_decl(tree_node*)
        ???:0
0x895b67 mark_used(tree_node*, int)
        ???:0
0x806f93 build_op_call(tree_node*, vec<tree_node*, va_gc, vl_embed>**, int)
        ???:0
0x9d8b67 finish_call_expr(tree_node*, vec<tree_node*, va_gc, vl_embed>**, bool,
bool, int)
        ???:0
0x8d2869 build_invoke(tree_node*, tree_node const*, int)
        ???:0
0x9e06ad finish_trait_expr(unsigned long, cp_trait_kind, tree_node*,
tree_node*)
        ???:0
0x9ad1c1 tsubst_template_arg(tree_node*, tree_node*, int, tree_node*)
        ???:0
0x9b2467 tsubst_template_args(tree_node*, tree_node*, int, tree_node*)
        ???:0
0x9ab51b tsubst(tree_node*, tree_node*, int, tree_node*)
        ???:0
0x9abe5d tsubst(tree_node*, tree_node*, int, tree_node*)
        ???:0
0x9c4696 instantiate_class_template(tree_node*)
        ???:0
0xa028db complete_type(tree_node*)
        ???:0
0x9cc9a8 lookup_member(tree_node*, tree_node*, int, bool, int,
access_failure_info*)
        ???:0
```

To quickly reproduce:

https://gcc.godbolt.org/z/Y8Wrdzzos

Reply via email to