On Thursday, 11 April 2019 at 18:13:48 UTC, 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?

T is a local variable name passed to this code, which does generally return an
error when used in certain ways:


int x;

Code!x; // Basically the code at the top

if I try to do too much with x I get `cannot use local `x` as a parameter to a non-global template`. Usually when I try to pass T to another template I get this error.


But some things work. But I can't for the life of me understand why compiles is failing but the foreach loop is working.


The problem is that I am using compiles quite often and either I'm misusing it or it's got some bugs in it that worry me because maybe they are silently failing?

Note that I get no errors in my code and I do get the attributes so it is technically working.

It would be really nice to know why the compiles is failing, e.g.,

pragma(compilesmsg, __traits(getAttributes, T)) spits out the error.

Must be something else in your code because it works fine for me with this shortened example.

https://run.dlang.io/is/o8xESB

Reply via email to