On Saturday, 9 August 2014 at 10:36:55 UTC, Artur Skawina via Digitalmars-d-learn wrote:
On 08/09/14 03:20, Vlad Levenfeld via Digitalmars-d-learn wrote:
More opDispatch woes. This feature keeps biting me, yet I keep trying to use it.

This time I'm trying to access elements of a vector GLSL-style (without swizzling... for now).

Here's the relevant code:

struct Vector (uint length, Element = double)
{
        ref @property component (string c)()
        {
            enum mat = q{xyzw};
            enum col = q{rgba};
            enum tex = q{uv};

            static if (mat.canFind (c))
                return components[mat.countUntil (c)];
            else static if (col.canFind (c))
                return components[col.countUntil (c)];
            else static if (tex.canFind (c))
                return components[tex.countUntil (c)];
            else static assert (0);
        }

        ref @property opDispatch (string c)()
        if (c.length == 1)
        {
            auto v = component!c;
pragma(msg, typeof(v)); // this outputs the expected result
            return v; // so everything is fine, right? wrong...
        }

    Element[length] components;
}

Calling vector.component!`x` or something works fine, but calling vector.x fails with "Error: no property" etc.

Now, I'm used to opDispatch silently failing when it can't compile (very annoying btw), but in this case, I tested every line with a pragma (msg, __traits(compiles...)) and everything checks out. All expressions are verified CTFE-able. The compiler apparently makes it all the way through the method without a hitch, but then just fails symbol resolution anyway.

Is this just a bug? Does anyone have any advice on what else to try?

v.opDispatch!`x`;

Your opDispatch is returning a reference to a local stack-allocated
variable. D does not support real references; that 'auto v=...'
declaration creates a copy.

   ref @property opDispatch (string c)() { return component!c; }

[opDispatch works for every kind of symbol, there's no problem with
 @property]

artur

Yeah, sorry, I made that change last-minute to verify, with the pragma, that I was indeed getting the correct type. The problem must have been something else. I just made a complete oversight in the process of throwing everything but the kitchen sink into debugging it.

Reply via email to