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