digitalmars.D.bugs - [Issue 4565] New: In array literals single values can replace arrays of length 1
- d-bugmail puremagic.com (34/34) Aug 01 2010 http://d.puremagic.com/issues/show_bug.cgi?id=4565
- d-bugmail puremagic.com (14/14) Oct 22 2012 http://d.puremagic.com/issues/show_bug.cgi?id=4565
- d-bugmail puremagic.com (9/11) Oct 22 2012 http://d.puremagic.com/issues/show_bug.cgi?id=4565
- d-bugmail puremagic.com (13/13) Oct 27 2012 http://d.puremagic.com/issues/show_bug.cgi?id=4565
- d-bugmail puremagic.com (24/43) Nov 15 2012 http://d.puremagic.com/issues/show_bug.cgi?id=4565
- d-bugmail puremagic.com (7/8) Nov 15 2012 Ok, you can close https://github.com/D-Programming-Language/dmd/pull/120...
- d-bugmail puremagic.com (43/74) Mar 11 2013 http://d.puremagic.com/issues/show_bug.cgi?id=4565
- d-bugmail puremagic.com (15/29) May 31 2013 http://d.puremagic.com/issues/show_bug.cgi?id=4565
http://d.puremagic.com/issues/show_bug.cgi?id=4565 Summary: In array literals single values can replace arrays of length 1 Product: D Version: D2 Platform: x86 OS/Version: Windows Status: NEW Keywords: accepts-invalid Severity: normal Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: bearophile_hugs eml.cc This program compiles with no errors with dmd 2.047: int[1][3] a1 = [1, 2, 3]; void main() { int[1][3] a2 = [1, 2, 3]; } But those array literals are wrong. This is the correct program: int[1][3] a1 = [[1], [2], [3]]; void main() { int[1][3] a2 = [[1], [2], [3]]; } A sloppy syntax is bad because it *always* offers space for bugs, like this one, dmd compiles this program with no errors (note the missing comma): int[1][3] a = [[1] [0], [2]]; void main() {} Now a contains [1, 2, 0], a silent bug. This situation is partially caused by bug 3849 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Aug 01 2010
http://d.puremagic.com/issues/show_bug.cgi?id=4565 Andrej Mitrovic <andrej.mitrovich gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |andrej.mitrovich gmail.com AssignedTo|nobody puremagic.com |andrej.mitrovich gmail.com 16:00:17 PDT --- Do you by any chance have a somewhat elaborate set of test-cases that cover many types of arrays which should and shouldn't compile? It would help to make solid test-cases. Otherwise I'll write them myself, no problem. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 22 2012
http://d.puremagic.com/issues/show_bug.cgi?id=4565Do you by any chance have a somewhat elaborate set of test-cases that cover many types of arrays which should and shouldn't compile?I don't, sorry. Currently finding such test cases is a laborious manual work. There is no fuzzy testing framework for D, as ones used on the certified C compiler. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 22 2012
http://d.puremagic.com/issues/show_bug.cgi?id=4565 yebblies <yebblies gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |pull CC| |yebblies gmail.com Platform|x86 |All OS/Version|Windows |All https://github.com/D-Programming-Language/dmd/pull/1207 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Oct 27 2012
http://d.puremagic.com/issues/show_bug.cgi?id=4565This program compiles with no errors with dmd 2.047: int[1][3] a1 = [1, 2, 3]; void main() { int[1][3] a2 = [1, 2, 3]; } But those array literals are wrong. This is the correct program: int[1][3] a1 = [[1], [2], [3]]; void main() { int[1][3] a2 = [[1], [2], [3]]; }I think this is not a bad program.int[1][3] a1 = [1, 2, 3];is same as: int[1][3] a1 = void; a1[0][] = 1; // fill all elements by 1 a1[1][] = 2; // fill all elements by 2 a1[2][] = 3; // fill all elements by 3 Then a1 is initialized by [[1], [2], [3]]. And it is consistent with: int[3] sa = 1; // sa is initialized to [1, 1, 1] ----A sloppy syntax is bad because it *always* offers space for bugs, like this one, dmd compiles this program with no errors (note the missing comma): int[1][3] a = [[1] [0], [2]]; void main() {}[1][0] is an expression which indexing array literal, and evaluated to 1. It's equivalent to: [1,2,3][0] == 1Now a contains [1, 2, 0], a silent bug.Now a is initialized by [1, [2]], and is same as: int[1][3] a = void; a[0][] = 1; a[1] = [2]; a[2][] = 0; // == int.init After all, a == [1, 2, 0]. There is no bug. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Nov 15 2012
http://d.puremagic.com/issues/show_bug.cgi?id=4565 00:56:56 PST ---After all, a == [1, 2, 0]. There is no bug.Ok, you can close https://github.com/D-Programming-Language/dmd/pull/1207 if bug is invalid. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Nov 15 2012
http://d.puremagic.com/issues/show_bug.cgi?id=4565 Sorry for the very delayed answer.In my opinion that's probably a bug in user code. I doubt the user meant to write that. Most probably the user meant to write this, but missed a comma after the first sub-array: int[1][3] a = [[1], [0], [2]]; void main() {} But this is an uncommon situation, so I think it's not worth thinking too much about it. What follows is more important:A sloppy syntax is bad because it *always* offers space for bugs, like this one, dmd compiles this program with no errors (note the missing comma): int[1][3] a = [[1] [0], [2]]; void main() {}[1][0] is an expression which indexing array literal, and evaluated to 1. It's equivalent to: [1,2,3][0] == 1Now a contains [1, 2, 0], a silent bug.Now a is initialized by [1, [2]], and is same as: int[1][3] a = void; a[0][] = 1; a[1] = [2]; a[2][] = 0; // == int.init After all, a == [1, 2, 0]. There is no bug.I think this is not a bad program.Today this syntax compiles: void main() { int[1][3] a2; a2[0][] = 1; a2[1][] = 2; a2[2][] = 3; } This used to compile fine, but today it gives warnings (and this is good): void main() { int[1][3] a3; a3[0] = 1; a3[1] = 2; a3[2] = 3; } temp.d(3): Warning: explicit element-wise assignment (a3[cast(uint)0])[] = 1 is better than a3[cast(uint)0] = 1 temp.d(4): Warning: explicit element-wise assignment (a3[cast(uint)1])[] = 2 is better than a3[cast(uint)1] = 2 temp.d(5): Warning: explicit element-wise assignment (a3[cast(uint)2])[] = 3 is better than a3[cast(uint)2] = 3 Currently both of the following forms are accepted: void main() { int[1][3] a1 = [[1], [2], [3]]; int[1][3] a2 = [1, 2, 3]; } Generally I trust your good judgement Hara, but if we are going to deprecate the assignment of array slices without using [], then I don't know if the idea of allowing both of those syntaxes is a good idea... -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------int[1][3] a1 = [1, 2, 3];is same as: int[1][3] a1 = void; a1[0][] = 1; // fill all elements by 1 a1[1][] = 2; // fill all elements by 2 a1[2][] = 3; // fill all elements by 3 Then a1 is initialized by [[1], [2], [3]]. And it is consistent with: int[3] sa = 1; // sa is initialized to [1, 1, 1]
Mar 11 2013
http://d.puremagic.com/issues/show_bug.cgi?id=4565 Shriramana Sharma <samjnaa gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |samjnaa gmail.com PDT ---I think this is not a bad program.FWIW I agree with bearophile here. In the case of having a single value on the RHS it is easy (?) to construe how int[3] a = 1 (or even maybe int[3][3] a = 1) would initialize all the elements, but when you specify an array literal on the RHS, I think it should have the same shape as the array specified in the type on the LHS to avoid hard-to-find bugs. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------int[1][3] a1 = [1, 2, 3];is same as: int[1][3] a1 = void; a1[0][] = 1; // fill all elements by 1 a1[1][] = 2; // fill all elements by 2 a1[2][] = 3; // fill all elements by 3 Then a1 is initialized by [[1], [2], [3]]. And it is consistent with: int[3] sa = 1; // sa is initialized to [1, 1, 1]
May 31 2013