Static foreach pull request

Stefan Koch via Digitalmars-d digitalmars-d at puremagic.com
Wed May 10 04:12:06 PDT 2017


On Wednesday, 10 May 2017 at 09:42:53 UTC, Timon Gehr wrote:
> On 09.05.2017 23:56, Timon Gehr wrote:
>>>
>>> core.exception.AssertError at ddmd/blockexit.d(90): Assertion 
>>> failure
>>> ----------------
>>> ...
>>
>> Thanks! (It's a known issue though:
>> https://github.com/tgehr/dmd/blob/static-foreach/test_staticforeach.d#L330.)
>>
>
> Actually, yours is a different case with the same outcome (f 
> and idonotexist do not matter at all, the issue exists even for 
> static foreach(j;0..0){}).
> All static foreach loops over empty (non-AliasSeq) aggregates 
> failed that assertion. The reason was that CTFE can return a 
> null literal from a function that returns T[], but the constant 
> folder cannot actually evaluate null.length for some reason.

So here is the difference between null and []:

null :

() { Slice* s; s = null; return s; }

[] :
() { Slice* s; s = alloca(sizeof(*s)); s.base = null; s.length = 
0; return s; }

Therefore

null.length => (cast(Slice*)null).length; which results in a 
segfault.

and

[].length => (cast(Slice*)somevalidSliceDiscriptor).length;


More information about the Digitalmars-d mailing list