www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 6906] New: Cannot assign value into associative array if contains opAssign

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

           Summary: Cannot assign value into associative array if contains
                    opAssign
           Product: D
           Version: D2
          Platform: Other
        OS/Version: Windows
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: Jesse.K.Phillips+D gmail.com



12:24:00 PST ---
This code fails to compile because the struct S implement opAssign and the
compiler tries using it rather than the associative arrays insert.

    void main() {
       S[string] ss;
       S s;

       ss["hello"] = s;
    }

    struct S {
       void opAssign(int i) {
       }
    }

test.d(6): Error: function test.S.opAssign (int i) is not callable using
argument types (S)
test.d(6): Error: cannot implicitly convert expression (s) of type S to int
test.d(6): Error: function test.S.opAssign (int i) is not callable using
argument types (S)
test.d(6): Error: cannot implicitly convert expression (s) of type S to int
PS C:\Documents and Settings\jphillips\src\Juno> dmd test.d
test.d(5): Error: function test.S.opAssign (int i) is not callable using
argument types (S)
test.d(5): Error: cannot implicitly convert expression (s) of type S to int
test.d(5): Error: function test.S.opAssign (int i) is not callable using
argument types (S)
test.d(5): Error: cannot implicitly convert expression (s) of type S to int

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


Don <clugdbug yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |clugdbug yahoo.com.au



I don't think this is a bug. I think the behaviour is intuitive.
ss["hello"] = s; looks like an assignment, and it currently behaves like one.
This code doesn't compile, either:

       S[2] ss;
       S s;
       ss[0] = s;

As you've defined it, S cannot participate in any assignment of any kind. You
can't even write:
S s;
S t;
t = s;

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


Jesse Phillips <Jesse.K.Phillips+D gmail.com> changed:

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



07:16:04 PST ---
Can I then say you aren't able to define opAssign for a struct and have it work
for associative arrays:

    void main() {
       S[string] ss;
       S s;

       ss["hello"] = s;
    }

    struct S {
       void opAssign(int i) {
       }
       void opAssign(S s) {
           this = s;
       }
    }

/tmp$ ./test
Segmentation fault

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


Don <clugdbug yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |wrong-code




 Can I then say you aren't able to define opAssign for a struct and have it work
 for associative arrays:
 
 /tmp$ ./test
 Segmentation fault
That's definitely a problem, but I don't think it has anything to do with AAs. This also creates a stack overflow: void main() { S s; S t; t = s; } struct S { void opAssign(S s) { this = s; } } Obviously it's changing 'this = XXX' into 'this.opAssign(XXX)'. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Nov 08 2011
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=6906


Kenji Hara <k.hara.pg gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|wrong-code                  |rejects-valid
             Status|NEW                         |RESOLVED
           Platform|Other                       |All
         Resolution|                            |FIXED
         OS/Version|Windows                     |All




 This code fails to compile because the struct S implement opAssign and the
 compiler tries using it rather than the associative arrays insert.
 
     void main() {
        S[string] ss;
        S s;
 
        ss["hello"] = s;
     }
 
     struct S {
        void opAssign(int i) {
        }
     }
 
 test.d(6): Error: function test.S.opAssign (int i) is not callable using
 argument types (S)
 test.d(6): Error: cannot implicitly convert expression (s) of type S to int
 test.d(6): Error: function test.S.opAssign (int i) is not callable using
 argument types (S)
 test.d(6): Error: cannot implicitly convert expression (s) of type S to int
 PS C:\Documents and Settings\jphillips\src\Juno> dmd test.d
 test.d(5): Error: function test.S.opAssign (int i) is not callable using
 argument types (S)
 test.d(5): Error: cannot implicitly convert expression (s) of type S to int
 test.d(5): Error: function test.S.opAssign (int i) is not callable using
 argument types (S)
 test.d(5): Error: cannot implicitly convert expression (s) of type S to int
From 2.062, the code could work. Even if a struct has only non-identity opAssign methods, identity assignment would be rewritten to the field-to-field assignment. struct S { int val; void opAssign(int i) {} } void main() { S s; S s2; s = s2; // Rewite as: s.tupleof = s2.tupleof; s = 1; // Rewrite as: s.opAssign(1) } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Sep 07 2013