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