[Issue 6906] Cannot assign value into associative array if contains opAssign

2013-09-07 Thread d-bugmail
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

2011-11-08 Thread d-bugmail
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

2011-11-08 Thread d-bugmail
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

2011-11-07 Thread d-bugmail
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: ---