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;
}
```

Reply via email to