On Friday, 25 February 2022 at 05:25:14 UTC, Ali Çehreli wrote:
> On 2/24/22 20:44, Andrey Zherikov wrote:
> How can I check that opAssign
is generated by compiler and doesn't exist in the original code?
I think this one:
https://dlang.org/phobos/std_traits.html#hasElaborateAssign
Ali
This take a struct as an argument, not a member, so I need to do if(sym == "opAssign")
. I gave this another thought and checking the symbol against "opAssign"
would be good enough for my use case.
Another interesting observation - is there any explanation why typeof
returns different results for generated opAssign
?
import std.sumtype: SumType;
struct A
{
SumType!int b;
}
static foreach(sym; __traits(allMembers, A))
{
// ref A(A p) return,opAssign
pragma(msg,
typeof(__traits(getMember, A, sym)).stringof,",",sym);
// true,pure nothrow @nogc ref @safe A(A p) return,opAssign
pragma(msg,
is(typeof(__traits(getMember, A, sym)) == function),",",
typeof(__traits(getMember, A, sym)).stringof,",",sym);
// pure nothrow @nogc ref @safe A(A p) return,opAssign
pragma(msg,
typeof(__traits(getMember, A, sym)).stringof,",",sym);
}
If I move foreach
loop into a function (e.g. main
) then the first pragma prints the same as the others.