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

--- Comment #5 from Federico Kircheis <federico at kircheis dot it> ---
Today I just found a possible workaround that involves macros and lambdas...

----
struct node {
    const char* d;
    const node& left;
};

#define LEAF(a) []()-> const node&{ constexpr static auto a = node{"a",Null};
return a; }()
#define NODE(a,b) []()-> const node&{constexpr static auto a = node{"a",b};
return a; }()

constexpr node Null = node{"",Null};

constexpr auto a = node{"a",NODE(a,LEAF(b))};
constexpr auto a2 = node{"a",node{"a", node{"a", Null}}};


constexpr int mysize(const node& n) noexcept{
    return (&n == &Null) ? 0 : 1 + mysize(n.left); 
}
constexpr auto size0 = mysize(Null);
static_assert(size0 == 0, "");

constexpr auto size3 = mysize(a);
static_assert(size3 == 3, "");
----

"mysize(a)" compiles, while "mysize(a2)" does not, even if the two
datastructures are  equivalent


Unfortunately clang does not accept it

Reply via email to