Is the following well defined and allowed?

Steven Schveighoffer schveiguy at yahoo.com
Thu Mar 1 20:14:07 UTC 2018


On 3/1/18 3:06 PM, ag0aep6g wrote:
> On Thursday, 1 March 2018 at 19:05:26 UTC, Steven Schveighoffer wrote:
>> Yes it behaves just like array bounds. No it's not well-defined if you 
>> disable asserts.
> 
> Right. So it's defined to throw an Error in @safe code, and it has 
> undefined behavior in @system code. The spec should say this.

No.

----
version(dosafe)
{
     void main() @safe
     {
         int[4] arr;
         arr[0 .. 3] = arr[1 .. 4];
     }
}
else
{
     void main()
     {
         int[4] arr;
         arr[0 .. 3] = arr[1 .. 4];
     }
}
---

dmd -version=dosafe -noboundscheck -run testarrayoverlap.d => no error, 
undefined behavior
dmd -run testarrayoverlap.d => error

@safe has nothing to do with it.

-Steve


More information about the Digitalmars-d mailing list