[Issue 17974] getSymbolsByUDA is returns unusable symbols when used in foreach

d-bugmail at puremagic.com d-bugmail at puremagic.com
Thu Nov 9 03:03:24 UTC 2017


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

Basile B. <b2.temp at gmx.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |b2.temp at gmx.com

--- Comment #2 from Basile B. <b2.temp at gmx.com> ---
(In reply to Artem Borisovskiy from comment #1)
> What I meant to say is that it can't even access the symbol to test if it
> has the attribute. Anyway, here's some more funny (not so at work) stuff:
> 
> // main.d
> import std.traits;
> enum Attr;
> 
> static struct FUBAR
> {
>     @Attr int a;
>     void dummy()
>     {
>         static foreach (symbol; getSymbolsByUDA!(FUBAR, Attr))
>             pragma(msg, getUDAs!(symbol, Attr).stringof);
>     }
> }
> 
> void main()
> {
>     static foreach (symbol; getSymbolsByUDA!(FUBAR, Attr))
>         pragma(msg, getUDAs!(symbol, Attr).stringof);
> }
> 
> Now I'm lost:
> 
> src/main.d(10): Error: value of 'this' is not known at compile time
> ()
> (Attr)
> 
> But if I make `dummy' static, it works:
> (Attr)
> (Attr)
> 
> The loop works even on module level (as it should). So it doesn't work only
> in non-static methods of FUBAR.

---
import std.traits;
enum Attr;

struct FUBAR
{
    @Attr int a;
    void dummy()
    {
        foreach (i, symbol; getSymbolsByUDA!(FUBAR, Attr))
            pragma(msg, getUDAs!(getSymbolsByUDA!(FUBAR, Attr)[i], Attr));
    }
    void dummy2()
    {
        static foreach (i; 0..getSymbolsByUDA!(FUBAR, Attr).length)
            pragma(msg, getUDAs!(getSymbolsByUDA!(FUBAR, Attr)[i], Attr));
    }
}

void main()
{
    static foreach (symbol; getSymbolsByUDA!(FUBAR, Attr))
        pragma(msg, getUDAs!(symbol, Attr).stringof);
}
---

Good luck.

--


More information about the Digitalmars-d-bugs mailing list