Thread overview
[Issue 7493] New: Initialization of void[][N]
Feb 13, 2012
Vladimir Panteleev
Feb 14, 2012
Walter Bright
Mar 20, 2012
Don
Mar 21, 2012
timon.gehr@gmx.ch
Mar 21, 2012
Don
Mar 21, 2012
timon.gehr@gmx.ch
Apr 04, 2012
Don
Apr 05, 2012
Walter Bright
February 13, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7493

           Summary: Initialization of void[][N]
           Product: D
           Version: D1
          Platform: All
        OS/Version: All
            Status: NEW
          Keywords: wrong-code
          Severity: regression
          Priority: P2
         Component: DMD
        AssignedTo: nobody@puremagic.com
        ReportedBy: thecybershadow@gmail.com


--- Comment #0 from Vladimir Panteleev <thecybershadow@gmail.com> 2012-02-13 06:26:16 PST ---
void main()
{
    string str = "Hi";
    void[][1] arr = [str];
    assert(arr[0].length == str.length);
}

Notably, changing the second line to
    void[][1] arr = str;
will make the assert pass, so I guess DMD is now trying some new way of array
assignment which succeeds due to the implicit void[] conversion.

Worked in 1.070, doesn't work in 1.071 or the latest D1 beta.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
February 14, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7493


Walter Bright <bugzilla@digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |bugzilla@digitalmars.com


--- Comment #1 from Walter Bright <bugzilla@digitalmars.com> 2012-02-14 00:48:11 PST ---
Since it's not a regression in 1.072, I'm going to defer this until the next cycle.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
March 20, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7493


Don <clugdbug@yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |clugdbug@yahoo.com.au
            Version|D1                          |D1 & D2


--- Comment #2 from Don <clugdbug@yahoo.com.au> 2012-03-19 22:24:25 PDT ---
Also applies to D2. The problem is that there are two possible interpretations:

void[] x = [str];
typeof(x)[1] = x;

void[] y = str;
typeof(y)[1] = [ y ];

I think this should be an error.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
March 21, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7493


timon.gehr@gmx.ch changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |timon.gehr@gmx.ch


--- Comment #4 from timon.gehr@gmx.ch 2012-03-21 13:10:05 PDT ---
DMD is inconsistent here. It is not clear what the behavior should be.

void main(){
    string[] s1,s2;
    s1=s1~[];
    s2~=[];
    writeln(s1," ",s2); // [""] []
}

I think most reasonable would be to check the array type for implicit conversions first and to consider the element type for implicit conversions only after the conversion to the array has failed. This would make appending/concatenating with an empty array literal a no-op for all array types and it would restore the behavior the OP expects.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
March 21, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7493



--- Comment #5 from Don <clugdbug@yahoo.com.au> 2012-03-21 14:14:57 PDT ---
(In reply to comment #4)
> DMD is inconsistent here. It is not clear what the behavior should be.
> 
> void main(){
>     string[] s1,s2;
>     s1=s1~[];
>     s2~=[];
>     writeln(s1," ",s2); // [""] []
> }
> 
> I think most reasonable would be to check the array type for implicit conversions first and to consider the element type for implicit conversions only after the conversion to the array has failed.

I don't think that's the same issue, and I don't like that approach for
initialization of void[]. It would mean that
void[][3] a = [ str, str, str];
void[][2] b = [ str, str, str];

means

a[0] == str
b[0] == [str, str, str]

I think this particular issue is specific to void[], since it is a recursive type (an array literal of void[] elements is also of type void[]).

The most intuitive approaches I would think are:
* void[][ANYTHING] = [ WHATEVER ] is _always_ a whole-array assignment;
OR
it is _always_ an error.
The current compiler behaviour, where it is always a block assignment, is less
intuitive but I think defensible.
But allowing it to be one or the other, depending on whether the implicit
conversion succeeds, is horribly unpredictable.

As far as I can tell, there is no mention at all of block assignment in the spec! Did I miss it?


> This would make
> appending/concatenating with an empty array literal a no-op for all array types
> and it would restore the behavior the OP expects.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
March 21, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7493



--- Comment #6 from timon.gehr@gmx.ch 2012-03-21 15:13:28 PDT ---
(In reply to comment #5)
> (In reply to comment #4)
> > DMD is inconsistent here. It is not clear what the behavior should be.
> > 
> > void main(){
> >     string[] s1,s2;
> >     s1=s1~[];
> >     s2~=[];
> >     writeln(s1," ",s2); // [""] []
> > }
> > 
> > I think most reasonable would be to check the array type for implicit conversions first and to consider the element type for implicit conversions only after the conversion to the array has failed.
> 
> I don't think that's the same issue,

It is very closely related. It is the same kind of issue.

> and I don't like that approach for
> initialization of void[]. It would mean that
> void[][3] a = [ str, str, str];
> void[][2] b = [ str, str, str];
> 
> means
> 
> a[0] == str
> b[0] == [str, str, str]

I see. That is a problem.

> 
> I think this particular issue is specific to void[], since it is a recursive type (an array literal of void[] elements is also of type void[]).
> 

The particular issue is specific to void[]. Possible resolutions could affect the entire language. (for example, this issue came up because of an only roughly related fix)

> The most intuitive approaches I would think are:
> * void[][ANYTHING] = [ WHATEVER ] is _always_ a whole-array assignment;

I think that is the best behavior. Block assignment can still work with []= .

> OR
> it is _always_ an error.

Then how do you initialize it? Element-wise?

> The current compiler behaviour, where it is always a block assignment, is less
> intuitive but I think defensible.
> But allowing it to be one or the other, depending on whether the implicit
> conversion succeeds, is horribly unpredictable.
> 
> As far as I can tell, there is no mention at all of block assignment in the spec! Did I miss it?
> 

The conversion rules for arrays and array literals are almost completely unspecified afaik.

Another ambiguous case:
import std.stdio;

class A{
    A[] as;
    this(){as = [new A(0),new A(0)];}
    this(int){}
    alias as this;
}

void main(){
    A a = new A;
    A[] as1;
    A[] as2;
    as1=as1~a;
    as2~=a;
    writeln(as1.length," ",as2.length); // 2 2
}

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
April 04, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7493



--- Comment #7 from Don <clugdbug@yahoo.com.au> 2012-04-04 02:56:24 PDT ---
https://github.com/D-Programming-Language/dmd/pull/866

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
April 05, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7493



--- Comment #8 from github-bugzilla@puremagic.com 2012-04-04 23:04:59 PDT ---
Commit pushed to master at https://github.com/D-Programming-Language/dmd

https://github.com/D-Programming-Language/dmd/commit/43796a5a0e5b6e86753cb7624fb502e6b36dce83 Fix issue 7493  Initialization of void[][N]

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
April 05, 2012
http://d.puremagic.com/issues/show_bug.cgi?id=7493


Walter Bright <bugzilla@digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|                            |FIXED


-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------