bug in compiles?

Alex AJ at gmail.com
Thu Apr 11 22:41:32 UTC 2019


On Thursday, 11 April 2019 at 20:49:45 UTC, bauss wrote:
> 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

Seriously? Do you think you have ESP? Your code isn't even close 
to was talking about ;/

Here is is updated that shows the error. You seem to fail to 
understand that it is impossible for it to be my code. There is 
no way the static if should fail yet the static foreach pass. 
They both go together, that is is the whole point of the static 
if, to make sure the foreach works, yet it says it doesn't work 
when it in fact does(as commenting out the line proves).



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();


}



More information about the Digitalmars-d-learn mailing list