bug in compiles?

Steven Schveighoffer schveiguy at gmail.com
Fri Apr 12 02:02:50 UTC 2019


On 4/11/19 6:45 PM, Alex wrote:
> On Thursday, 11 April 2019 at 19:42:05 UTC, Steven Schveighoffer wrote:
>> On 4/11/19 2:13 PM, Alex wrote:
>>> The following code works when I comment out the static if
>>>
>>> //static if (__traits(compiles, __traits(getAttributes, T)))
>>>     static foreach(a;  __traits(getAttributes, T)) Attributes ~=
>>>
>>>
>>> There seems to be absolutely no reason why this code would fail with 
>>> the static if but pass without it but in the first case I get no 
>>> attributes because the __traits compiles fails.
>>>
>>>
>>>
>>> __traits(compiles, __traits(getAttributes, T))
>>>
>>> vs
>>>
>>> __traits(getAttributes, T)
>>>
>>> How could it not compile in the first case and yet work in the foreach?
>>
>> It should. Do you have a larger example? One that can be played with?
>>
>> -Steve
> 
> import std.stdio, std.traits, std.conv;
> 
> 
> struct A(alias T)
> {
>      static void foo()
>      {
>          static if (__traits(compiles, __traits(getAttributes, T))) // 
> Failing for some reason
>              static foreach(a;  __traits(getAttributes, T)) pragma(msg, 
> to!string(a), "-", typeof(a).stringof);
>      }
> }
> 
> void main()
> {
>      @(3) int a;
> 
>      (A!a).foo();
> }
> 
> Commenting out the static if allows the foreach to pass and everything 
> works. The whole point of the static if is to let the foreach work.
> 
> Both are only dependent on
> 
> __traits(getAttributes, T)
> 
> So if that can't compile then how could the foreach work?
> 
> https://run.dlang.io/is/WlXCIZ
> 
> 

Seems like a bug to me.

These all work:

@(3) int a;

static assert(__traits(compiles, __traits(getAttributes, a)));
alias X = a;
static assert(__traits(compiles, __traits(getAttributes, X)));

But this does not:

static function foo(alias T)()
{
    static assert(__traits(compiles, __traits(getAttributes, T)));
}

foo!a;

I think all 3 should work.

-Steve


More information about the Digitalmars-d-learn mailing list