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