www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 24013] New: [REG 2.103.0] result of __traits(getOverloads) is

https://issues.dlang.org/show_bug.cgi?id=24013

          Issue ID: 24013
           Summary: [REG 2.103.0] result of __traits(getOverloads) is not
                    converted to a delegate anymore
           Product: D
           Version: D2
          Hardware: All
                OS: All
            Status: NEW
          Keywords: rejects-valid
          Severity: regression
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: b2.temp gmx.com



Code used to compile and works until version 2.103.0

The problem seems to be that `&overload`, with `overload` coming from
`__traits(getOverloads,...)` is not converted to a delegate anymore.



```
module reg2103;

import std.traits, std.meta;

alias GenericDescriptor = PropDescriptor!int;

struct PropDescriptor(T)
{
    static if (!is(T == struct))
    {
        alias PropSetter = void delegate(T value);
        alias PropGetter = T delegate();
    }
    else
    {
        alias PropSetter = void delegate(T value);
        alias PropGetter = ref T delegate() return;
    }

    PropSetter _setter;
    PropGetter _getter;

    string _name;

    void define(PropSetter aSetter, PropGetter aGetter, string aName)
    {
        setter(aSetter);
        getter(aGetter);
    }

    void setter(PropSetter value)
    {
        _setter = value;
    }

    PropSetter setter(){return _setter;}

    void getter(PropGetter value)
    {
        _getter = value;
    }

    PropGetter getter(){return _getter;}

    void name(string value)
    {
        _name = value;
    }

    ref string name()
    {
        return _name;
    }
}

enum Set;
enum Get;

mixin template PropertyPublisherImpl()
{
    void*[] _publishedDescriptors;

    void collectPublicationsFromPairs(T)()
    {
        foreach (member; __traits(derivedMembers, T))
        foreach (overload; __traits(getOverloads, T, member))
        {
            alias Attributes = __traits(getAttributes, overload);
            enum bool getterAttrib = staticIndexOf!(Get, Attributes) != -1;
            enum bool setterAttrib = staticIndexOf!(Set, Attributes) != -1;
            // define the getter
            static if (getterAttrib)
            {
                alias Type = ReturnType!overload;
                auto descriptor = new PropDescriptor!Type;
                auto dg = &overload;
                descriptor.define(descriptor.setter, dg, member);
            }
        }
    }
}

void main()
{
    class Bar
    {
        size_t _field;
        mixin PropertyPublisherImpl;
        this()
        {
            collectPublicationsFromPairs!Bar;
        }
         Set void field(size_t aValue)
        {
        }
         Get size_t field()
        {
            return _field;
        }
    }
    auto _ = new Bar;
}
```

--
Jun 25 2023