On Friday, 4 January 2013 at 16:04:59 UTC, Philippe Sigaud wrote:
So, I'm testing how to transfer UDA from one symbol to another.

```
auto transferAttributes(alias origin, To)(To t)
{
    @(__traits(getAttributes, origin)) To temp = t;
    pragma(msg, __traits(getAttributes, temp));
    return temp;
}

void main()
{
    @(3, "hello") int i = 10;
    writeln("[",__traits(getAttributes, i), "]");

    double d = 3.14;
    auto d2 = transferAttributes!(i)(d);

transferAttributes attaches the attributes to the local declaration. I'd be surprised if they were copied to the outer declaration. Or did you mean attributing the return *type*?

    // Doesn't work
    writeln("[",__traits(getAttributes, d2), "]");

    // Works:
    @(__traits(getAttributes, i)) double d3 = 3.14;
    writeln("[",__traits(getAttributes, d3), "]");
}
```

Begins at the end: d3 (a double) indeed ends up as having i (an int) attributes. All is well and good.

But transferAttributes does not work: inside its scope, temp has the attributes from origin, but not when it gets out.

Also, dropping the auto return is not accepted by the compiler, even though it seems natural for me:

@(__traits(getAttributes, origin)) To transferAttributes(alias origin, To)(To t)
{
    @(__traits(getAttributes, origin)) To temp = t;
...

'origin' is a template parameter and should be reachable to determine the return type.

That's a bug. Anyway, you are attributing the function declaration here, not the return type, which is another problem as it looks we do not have a syntax for that and "auto" is required:

auto foo()
{
    @attr struct S {}
    return S.init;
}





Reply via email to