https://issues.dlang.org/show_bug.cgi?id=16675
Issue ID: 16675 Summary: Overlapping is detected at runtime for + and * array operation, but not for - and /. Product: D Version: D2 Hardware: x86 OS: Windows Status: NEW Severity: normal Priority: P1 Component: druntime Assignee: nob...@puremagic.com Reporter: olegu...@gmail.com I am new in D, but saw some strage behaviour. Overlapping is detected for + and * array operation, but not for - and /. Ex. import std.stdio; void main() { int[] slice = [2, 2, 2, 2]; int[] slice2 = slice[0 .. $ - 1]; int[] slice3 = slice[1 .. $]; writeln("slice before: ", slice); writeln("slice2 before: ", slice2); writeln("slice3 before: ", slice3); enum cmd = "slice3[] = slice2[] + slice3[];"; writeln( "cmd: ", cmd ); mixin( cmd ); writeln("slice after : ", slice); writeln("slice2 after : ", slice2); writeln("slice3 after : ", slice3); } When this code is run at 'dlang.org' online compiler slice before: [2, 2, 2, 2] slice2 before: [2, 2, 2] slice3 before: [2, 2, 2] cmd: slice3[] = slice2[] + slice3[]; object.Error@(0): Overlapping arrays in vector operation: 8 byte(s) overlap of 12 ---------------- ??:? nothrow @safe void rt.util.array._enforceNoOverlap(const(char[]), ulong, ulong, const(ulong)) [0x44f7f3] ??:? _arraySliceSliceAddSliceAssign_i [0x44c1b6] ??:? _Dmain [0x4408bb] ??:? _D2rt6dmain211_d_run_mainUiPPaPUAAaZiZ6runAllMFZ9__lambda1MFZv [0x44c8a6] ??:? void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate()) [0x44c7f0] ??:? void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).runAll() [0x44c862] ??:? void rt.dmain2._d_run_main(int, char**, extern (C) int function(char[][])*).tryExec(scope void delegate()) [0x44c7f0] ??:? _d_run_main [0x44c761] ??:? main [0x44a389] ??:? __libc_start_main [0x40d80a14] OK If change + to - enum cmd = "slice3[] = slice2[] - slice3[];"; When it is run at 'dlang.org' slice before: [2, 2, 2, 2] slice2 before: [2, 2, 2] slice3 before: [2, 2, 2] cmd: slice3[] = slice2[] - slice3[]; slice after : [2, 0, -2, -4] slice2 after : [2, 0, -2] slice3 after : [0, -2, -4] The same behaviour I saw in Windows with DMD2.072.0 and DMD2.069.2 --