[Issue 6906] Cannot assign value into associative array if contains opAssign
http://d.puremagic.com/issues/show_bug.cgi?id=6906 Kenji Hara k.hara...@gmail.com changed: What|Removed |Added Keywords|wrong-code |rejects-valid Status|NEW |RESOLVED Platform|Other |All Resolution||FIXED OS/Version|Windows |All --- Comment #4 from Kenji Hara k.hara...@gmail.com 2013-09-07 10:01:04 PDT --- (In reply to comment #0) 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: ---
[Issue 6906] Cannot assign value into associative array if contains opAssign
http://d.puremagic.com/issues/show_bug.cgi?id=6906 Jesse Phillips jesse.k.phillip...@gmail.com changed: What|Removed |Added CC||jesse.k.phillip...@gmail.co ||m --- Comment #2 from Jesse Phillips jesse.k.phillip...@gmail.com 2011-11-08 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: ---
[Issue 6906] Cannot assign value into associative array if contains opAssign
http://d.puremagic.com/issues/show_bug.cgi?id=6906 Don clugd...@yahoo.com.au changed: What|Removed |Added Keywords||wrong-code --- Comment #3 from Don clugd...@yahoo.com.au 2011-11-08 22:59:29 PST --- (In reply to comment #2) 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: ---
[Issue 6906] Cannot assign value into associative array if contains opAssign
http://d.puremagic.com/issues/show_bug.cgi?id=6906 Don clugd...@yahoo.com.au changed: What|Removed |Added CC||clugd...@yahoo.com.au --- Comment #1 from Don clugd...@yahoo.com.au 2011-11-07 23:07:16 PST --- 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: ---