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`?
```d
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.

Reply via email to