https://issues.dlang.org/show_bug.cgi?id=14682
--- Comment #12 from Kenji Hara <[email protected]> --- (In reply to Kenji Hara from comment #3) > At a concatenation expression, arr ~ elem is preferred than arr ~ arr2 when > elem is implicitly convertible to typeof(arr[i]). In the code, the rhs `[]` > is implicitly convertible to typeof("foo") == string. Sorry I was mistaken. Normally D's array concatenation prefers two arrays concat, rather than prepending/appending one element. I noticed a comment in CatExp::semantic explains how the ambiguity should be resolved to. if (tb1next && tb2next && (tb1next->implicitConvTo(tb2next) >= MATCHconst || tb2next->implicitConvTo(tb1next) >= MATCHconst ) ) { /* Here to avoid the case of: * void*[] a = [cast(void*)1]; * void*[] b = [cast(void*)2]; * a ~ b; * becoming: * a ~ [cast(void*)b]; */ } And in CatAssignExp::semantic, array appending is already preferred than element appending. int[] a1; int[][] a2; int[][][] a3; import std.stdio; { auto x = a1 ~ []; x.writeln(); } // prints [] { auto x = a2 ~ []; x.writeln(); } // prints [] { auto x = a3 ~ []; x.writeln(); } // prints [] Therefore I can say it's just an implementation bug in dmd. --
