https://gcc.gnu.org/bugzilla/show_bug.cgi?id=123694
Marek Polacek <mpolacek at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |mpolacek at gcc dot gnu.org
Keywords| |ice-on-invalid-code
Status|UNCONFIRMED |NEW
Ever confirmed|0 |1
Last reconfirmed| |2026-01-19
--- Comment #2 from Marek Polacek <mpolacek at gcc dot gnu.org> ---
Confirmed. Compiling the .ii file won't crash, so here's a .C file:
```
#include <array>
#include <meta>
#include <print>
namespace functions{
void powerUp();
int getStatus();
std::string_view getName(uint64_t ipAddr);
}
struct Functions{
void powerUp();
int getStatus();
std::string_view getName(uint64_t ipAddr);
};
constexpr auto info = std::meta::info{};
constexpr auto infoInfo = ^^info;
using InfoType = decltype(^^int);
constexpr auto intInfo = ^^int;
consteval auto getMembers(){
}
static_assert(is_namespace(^^functions));
static_assert(!is_namespace_alias(^^functions));
namespace fns = functions;
static_assert(is_namespace_alias(^^fns));
constexpr auto basics(){
std::println("{}", std::meta::display_string_of(info));
std::println("{}", std::meta::display_string_of(InfoType{}));
std::println("{}", std::meta::identifier_of(^^info));
std::println("{}", std::meta::identifier_of(infoInfo));
std::println("{}", std::meta::identifier_of(^^infoInfo));
std::println("{}", std::meta::is_type(intInfo));
return 0;
}
constexpr auto backAndForth(){
typename [:intInfo:] x = 3;
std::println("{}", x);
}
struct Test{
int a;
bool b;
double c;
std::string_view d;
};
struct S {
int a;
bool b;
};
consteval auto member_number(int n) {
auto ctx = std::meta::access_context::current();
return std::meta::nonstatic_data_members_of(^^S, ctx)[n];
}
constexpr S structThings() {
S s{0, 0};
s.[:member_number(0):] = 42;
s.[:member_number(1):] = false;
return s;
}
struct FunctionInfo{
std::string_view identifier;
std::string_view returnType;
std::string_view parameters;
};
consteval auto member_names(){
constexpr auto ctx = std::meta::access_context::current();
constexpr static auto members =
std::define_static_array(std::meta::members_of(^^functions, ctx));
std::array<FunctionInfo, members.size()> layout;
for (size_t i = 0; i < members.size(); ++i){
layout[i].identifier = std::meta::identifier_of(members[i]);
const auto parameters =
std::define_static_array(parameters_of(members[i]));
if (parameters.size() > 0){
const auto firstParam = parameters[0];
layout[i].parameters = identifier_of(variable_of(firstParam));
}
else {
layout[i].parameters = "";
}
layout[i].returnType = display_string_of(return_type_of(members[i]));
}
return layout;
}
auto inspectStaticArray(){
constexpr auto ctx = std::meta::access_context::current();
constexpr static auto members =
std::define_static_array(std::meta::members_of(^^functions, ctx));
std::println("{}", display_string_of(^^members));
std::println("{}", display_string_of(^^decltype(members)));
}
int main () {
auto s = structThings();
std::println("{}", s.a);
constexpr auto ctx = std::meta::access_context::current();
constexpr static auto members =
std::define_static_array(std::meta::members_of(^^functions, ctx));
std::array<FunctionInfo, members.size()> layout;
template for (size_t i = 0; i < members.size(); ++i){
layout[i].identifier = std::meta::identifier_of(members[i]);
constexpr auto parameters =
std::define_static_array(parameters_of(members[i]));
if (parameters.size() > 0){
constexpr auto firstParam = parameters[0];
layout[i].parameters = identifier_of(variable_of(firstParam));
}
else {
layout[i].parameters = "";
}
layout[i].returnType = display_string_of(return_type_of(members[i]));
}
for (const auto member : layout)
{
std::println("Function: {{\n{},\n{},\nReturns: {}\n}}",
member.identifier, member.parameters, member.returnType);
}
return 0;
}
```