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

            Bug ID: 124150
           Summary: [reflection] internal compiler error: in get_fns, at
                    cp/tree.cc:2795
           Product: gcc
           Version: 16.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: ---

Original test provided by Alexey Saldyrkine; I've simplified it somewhat.

```
#include <meta>
using namespace std;

template <typename T>
consteval meta::info find_non_static_template_function() {
    for (auto r : meta::members_of(^^T, meta::access_context::current())) {
        if (meta::identifier_of(r) == "non_static_function") {
            return r;
        }
    }
    return ^^void;
}
template <typename T>
consteval meta::info find_static_template_member_func() {
    for (auto r : meta::members_of(^^T, meta::access_context::current())) {
        if (meta::identifier_of(r) == "static_function") {
            return r;
        }
    }
    return ^^void;
}
template <typename T>
consteval meta::info find_non_template_member_func() {
    for (auto r : meta::members_of(^^T, meta::access_context::current())) {
        if (meta::identifier_of(r) == "non_template_member_func") {
            return r;
        }
    }
    return ^^void;
}

template <typename T, typename Ts, meta::info static_func, meta::info
non_static_func,
          meta::info non_template_func>
void call_member_template_functions(Ts* ptr) {
    [:substitute(static_func, {^^T}):]();
    ptr->[:substitute(non_static_func, {^^T}):]();
    ptr->[:non_template_func:]();
}

struct A {
    template <typename T>
    static void static_function() { }
    template <typename T>
    void non_static_function() { }
    void non_template_member_func() { }
};

template <typename T, meta::info r>
void call_non_member_template_function() {
    [:meta::substitute(r, {^^T}):]();
}

template <typename T>
void non_member_template_function() { }

int
main ()
{
    A a;
    call_member_template_functions<int, A,
find_static_template_member_func<A>(),
                                   find_non_static_template_function<A>(),
                                   find_non_template_member_func<A>()>(&a);
    call_non_member_template_function<int, ^^non_member_template_function>();
}
```

ice.C: In instantiation of ‘void call_member_template_functions(Ts*) [with T =
int; Ts = A; std::meta::info static_func = ^^A::static_function();
std::meta::info non_static_func = ^^A::non_static_function(); std::meta::info
non_template_func = ^^A::non_template_member_func()]’:
ice.C:62:71:   required from here
   60 |     call_member_template_functions<int, A,
find_static_template_member_func<A>(),
      |    
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   61 |                                   
find_non_static_template_function<A>(),
      |                                   
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   62 |                                   
find_non_template_member_func<A>()>(&a);
      |                                   
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~
ice.C:35:39: internal compiler error: in get_fns, at cp/tree.cc:2795
   35 |     [:substitute(static_func, {^^T}):]();
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~
0x3195804 internal_error(char const*, ...)
        /home/mpolacek/src/gcc/gcc/diagnostic-global-context.cc:787
0x31a410f fancy_abort(char const*, int, char const*)
        /home/mpolacek/src/gcc/gcc/diagnostics/context.cc:1812
0x8eda59 get_fns(tree_node*)
        /home/mpolacek/src/gcc/gcc/cp/tree.cc:2795
0x8eda77 get_first_fn(tree_node*)
        /home/mpolacek/src/gcc/gcc/cp/tree.cc:2804
0x8a07a1 finish_call_expr(tree_node*, vec<tree_node*, va_gc, vl_embed>**, bool,
bool, int)
        /home/mpolacek/src/gcc/gcc/cp/semantics.cc:3453
0x81936d tsubst_expr(tree_node*, tree_node*, int, tree_node*)
        /home/mpolacek/src/gcc/gcc/cp/pt.cc:22255
0x810225 tsubst_stmt
        /home/mpolacek/src/gcc/gcc/cp/pt.cc:20612
0x80648b tsubst_stmt
        /home/mpolacek/src/gcc/gcc/cp/pt.cc:19403
0x806300 tsubst_stmt
        /home/mpolacek/src/gcc/gcc/cp/pt.cc:19385
0x809cff tsubst_stmt
        /home/mpolacek/src/gcc/gcc/cp/pt.cc:19806
0x835d11 instantiate_body
        /home/mpolacek/src/gcc/gcc/cp/pt.cc:28417
0x8377c4 instantiate_decl(tree_node*, bool, bool)
        /home/mpolacek/src/gcc/gcc/cp/pt.cc:28710
0x837aa4 instantiate_pending_templates(int)
        /home/mpolacek/src/gcc/gcc/cp/pt.cc:28785
0x5bd45e c_parse_final_cleanups()
        /home/mpolacek/src/gcc/gcc/cp/decl2.cc:5888
0xa0503a c_common_parse_file()
        /home/mpolacek/src/gcc/gcc/c-family/c-opts.cc:1440

Reply via email to