The following compiles in DMD 1.045, but shouldn't: void main() { int[] a = [1,2]; int[] b = [1,2]; a[] += b; assert (b[0] == 1); assert (b[1] == 2); assert (a[0] == 2); assert (a[1] == 4); } Currently, the code compiles but the third assertion fails, since DMD generates code as though b were an int. Note that the following both compiles and doesn't assert: void main() { int[] a = [1,2]; int[] b = [1,2]; a[] += b; assert (b[0] == 1); assert (b[1] == 2); assert (a[0] == 1+*cast(int*)&b); assert (a[1] == 2+*cast(int*)&b); } This is, of course, nonsense. The error is in the line 'a[] += b': according to http://www.digitalmars.com/d/1.0/arrays.html "[t]he rvalue can be an expression consisting either of an array slice of the same length and type as the lvalue or an expression of the element type of the lvalue, in any combination." Thus the line is incorrect and should read 'a[] += b[]', and that indeed works.
Fixed DMD1.059 and 2.044
Reopened, because this wrong code compiles still with dmd v2.044, the bug persists: void main() { int[] a = [1,2]; int[] b = [1,2]; a[] += b; assert (b[0] == 1); assert (b[1] == 2); assert (a[0] == 2); assert (a[1] == 4); }
(In reply to comment #2) > Reopened, because this wrong code compiles still with dmd v2.044, the bug > persists: > > void main() { > int[] a = [1,2]; > int[] b = [1,2]; > a[] += b; > assert (b[0] == 1); > assert (b[1] == 2); > assert (a[0] == 2); > assert (a[1] == 4); > } Oops, it's fixed only in my personal copy, not in the official DMD.
http://www.dsource.org/projects/dmd/changeset/509
AltStyle によって変換されたページ (->オリジナル) / アドレス: モード: デフォルト 音声ブラウザ ルビ付き 配色反転 文字拡大 モバイル