www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 5705] New: Swapping identical tuple causes "overlapping array copy" exception.

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5705

           Summary: Swapping identical tuple causes "overlapping array
                    copy" exception.
           Product: D
           Version: D2
          Platform: Other
        OS/Version: All
            Status: NEW
          Severity: regression
          Priority: P2
         Component: Phobos
        AssignedTo: nobody puremagic.com
        ReportedBy: kennytm gmail.com



import std.algorithm, std.typecons;
void main() {
    auto t = tuple(1);
    swap(t, t);
}

The above program causes an exception in _d_arraycopy:

object.Exception src/rt/arraycat.d(40): overlapping array copy
----------------
5   y                                   0x000154c4 _d_arraycopy + 200
6   y                                   0x000026b5 pure nothrow  trusted void
std.algorithm.swap!(std.typecons.Tuple!(int).Tuple).swap(ref
std.typecons.Tuple!(int).Tuple, ref std.typecons.Tuple!(int).Tuple) + 169
7   y                                   0x00001ee9 _Dmain + 33
8   y                                   0x00015edf extern (C) int
rt.dmain2.main(int, char**).void runMain() + 23
9   y                                   0x00015e66 extern (C) int
rt.dmain2.main(int, char**).void tryExec(scope void delegate()) + 38
10  y                                   0x00015f27 extern (C) int
rt.dmain2.main(int, char**).void runAll() + 59
11  y                                   0x00015e66 extern (C) int
rt.dmain2.main(int, char**).void tryExec(scope void delegate()) + 38
12  y                                   0x00015df7 main + 179
13  y                                   0x00001ebd start + 53
14  ???                                 0x00000001 0x0 + 1

It should do nothing instead of throwing this exception. As a result of this
bug, it is impossible to sort() on an array of tuples.

This bug is absent at least since 2.042 and present on or before 2.052.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 05 2011
next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5705


Andrei Alexandrescu <andrei metalanguage.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
                 CC|                            |andrei metalanguage.com
         AssignedTo|nobody puremagic.com        |andrei metalanguage.com


-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 05 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5705




This could probably be fixed/worked-around in druntime.

diff --git a/src/rt/arraycat.d b/src/rt/arraycat.d
index c0aaa4d..e9c2c85 100644
--- a/src/rt/arraycat.d
+++ b/src/rt/arraycat.d
   -35,7 +35,7    byte[] _d_arraycopy(size_t size, byte[] from, byte[] to)
     {
         memcpy(to.ptr, from.ptr, to.length * size);
     }
-    else
+    else if (to.ptr != from.ptr)
     {
         throw new Exception("overlapping array copy");
     }

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 05 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5705


kennytm gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |bearophile_hugs eml.cc



*** Issue 5716 has been marked as a duplicate of this issue. ***

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Mar 08 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5705


kennytm gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
            Summary|Swapping identical tuple    |Swapping identical struct
                   |causes "overlapping array   |with hasElaborateAssign
                   |copy" exception.            |causes "overlapping array
                   |                            |copy" exception.



The the reason is Tuple has an opAssign. The same reason goes for SysTime
(issue 5853). Generalized test case:

-------------------------------
import std.algorithm : swap;

struct X {
    int x;
    void opAssign(X z) {
        x = z.x;
    }
}

void main() {
    X y;
    swap(y, y);
}
-------------------------------

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Apr 18 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5705


kennytm gmail.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |Jesse.K.Phillips+D gmail.co
                   |                            |m



*** Issue 5853 has been marked as a duplicate of this issue. ***

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Apr 18 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5705




*** Issue 6093 has been marked as a duplicate of this issue. ***

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 02 2011
prev sibling next sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5705


dawg dawgfoto.de changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |soarowl yeah.net



*** Issue 4789 has been marked as a duplicate of this issue. ***

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Jun 18 2011
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=5705


dawg dawgfoto.de changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|ASSIGNED                    |RESOLVED
                 CC|                            |dawg dawgfoto.de
         Resolution|                            |FIXED



https://github.com/D-Programming-Language/phobos/commit/b776f8b5d22a5894467a31c6b7c6192147a2e649

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