www.digitalmars.com         C & C++   DMDScript  
Archives

D Programming
digitalmars.D
digitalmars.D.bugs
digitalmars.D.dtl
digitalmars.D.ide
digitalmars.D.dwt
digitalmars.D.announce
digitalmars.D.learn
digitalmars.D.debugger
D.gnu
D

C/C++ Programming
c++
c++.announce
c++.atl
c++.beta
c++.chat
c++.command-line
c++.dos
c++.dos.16-bits
c++.dos.32-bits
c++.idde
c++.mfc
c++.rtl
c++.stl
c++.stl.hp
c++.stl.port
c++.stl.sgi
c++.stlsoft
c++.windows
c++.windows.16-bits
c++.windows.32-bits
c++.wxwindows

digitalmars.empire
digitalmars.DMDScript
electronics


digitalmars.D.bugs - [Issue 3064] New: Invalid array operation accepted, generates bad code

http://d.puremagic.com/issues/show_bug.cgi?id=3064

           Summary: Invalid array operation accepted, generates bad code
           Product: D
           Version: 1.045
          Platform: x86_64
               URL: http://www.digitalmars.com/d/1.0/arrays.html
        OS/Version: Linux
            Status: NEW
          Keywords: accepts-invalid, wrong-code
          Severity: major
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: matti.niemenmaa+dbugzilla iki.fi


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.

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