www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 17974] New: getSymbolsByUDA is returns unusable symbols when

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

          Issue ID: 17974
           Summary: getSymbolsByUDA is returns unusable symbols when used
                    in foreach
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P1
         Component: phobos
          Assignee: nobody puremagic.com
          Reporter: kolos80 bk.ru

First things first (omitting irrelevant portions):

$ dmd --version
DMD64 D Compiler v2.077.0

$ pacman -Qi libphobos
Version         : 1:2.077.0-1

Now, getSymbolsByUDA is completely unusable when used in `foreach' loops.
First, the symbols it returns seem to be lacking the attribute in question:

// main.d
import std.traits;
enum Attr;

static struct FUBAR
{
     Attr int a;
    void dummy()
    {
        foreach (symbol; getSymbolsByUDA!(FUBAR, Attr))
            static assert(hasUDA!(symbol, Attr));
    }
}

Tried to compile it with `dmd -c main.d', got this:
src/main.d(11): Error: static assert  hasUDA!(symbol, Attr) is false

Commented out the loop and added this:

void main()
{
    static assert(hasUDA!(getSymbolsByUDA!(FUBAR, Attr), Attr));
    foreach (symbol; getSymbolsByUDA!(FUBAR, Attr))
        static assert(hasUDA!(symbol, Attr));
}

And now it makes even less sense:
src/main.d(18): Error: need 'this' for 'a' of type 'int'
src/main.d(19):        while evaluating: static assert(hasUDA!(symbol, Attr))

So it has the attribute in `static assert', but doesn't in `foreach'. What's
going on?

--
Nov 08 2017