On 26 June 2016 at 09:36, Iain Buclaw <[email protected]> wrote:
> On 26 June 2016 at 03:30, Timon Gehr via Digitalmars-d > <[email protected]> wrote: > > On 17.06.2016 21:59, kinke wrote: > >> > >> > >> Most interesting IMO though is the question when the slicee's pointer is > >> to be loaded. This is only relevant if the base is an lvalue and may > >> therefore be modified when evaluating the bound expressions. Should the > >> returned slice be based on the slicee's buffer before or after > >> evaluating the bounds expressions? > >> This has been triggered by > >> https://github.com/ldc-developers/ldc/issues/1433 as LDC loads the > >> pointer before evaluating the bounds. > > > > > > Evaluation order should be strictly left-to-right. DMD and GDC get it > wrong > > here. > > > > It is evaluated left-to-right. getBase() -> getLowerBound() -> > getUpperBound(). > Ah, I see what you mean. I think you may be using an old GDC version. Before I used to cache the result of getBase(). Old codegen: _base = *(getBase()); _lwr = getLowerBound(_base.length); _upr = getUpperBound(_base.length); r = {.length=(_upr - _lwr), .ptr=_base.ptr + _lwr * 4}; --- Now when creating temporaries of references, the reference is stabilized instead. New codegen: *(_ptr = getBase()); _lwr = getLowerBound(_ptr.length); _upr = getUpperBound(_ptr.length); r = {.length=(_upr - _lwr), .ptr=_ptr.ptr + _lwr * 4}; --- I suggest you fix LDC if it doesn't already do this. :-)
