[Issue 3914] Struct as argument that fits in register has member accessed wrong

2010-04-10 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=3914


Don clugd...@yahoo.com.au changed:

   What|Removed |Added

 Status|NEW |RESOLVED
 Resolution||FIXED


--- Comment #4 from Don clugd...@yahoo.com.au 2010-04-09 19:15:20 PDT ---
Fixed DMD1.058 and DMD2.042.

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


[Issue 3914] Struct as argument that fits in register has member accessed wrong

2010-03-12 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=3914


Don clugd...@yahoo.com.au changed:

   What|Removed |Added

   Keywords||patch


--- Comment #2 from Don clugd...@yahoo.com.au 2010-03-12 05:51:40 PST ---
PATCH: The struct ss is passed in EAX. The backend wants ss.b. It sees that
ss.b is already in EAX, so it doesn't reload it into AX. But AX actually
contains ss.a.
Solution: Disable the optimisation in cod1.loaddata() if it's a subsequent
member of the struct.

Index: cod1.c
===
--- cod1.c(revision 413)
+++ cod1.c(working copy)
@@ -3453,6 +3453,7 @@
 // See if we can use register that parameter was passed in
 if (regcon.params  e-EV.sp.Vsym-Sclass == SCfastpar 
 regcon.params  mask[e-EV.sp.Vsym-Spreg] 
+!(e-Eoper == OPvar  e-EV.sp.Voffset  0)  // Must be at the base of
that variable
 sz = REGSIZE)// make sure no 'paint' to a larger size
happened
 {
 reg = e-EV.sp.Vsym-Spreg;

=
Reduced test case:
=
struct Snake {
short a, b;
}

void venom(short dd)
{
  assert(dd == 'B');
}

void serpent( Snake ss ) {
  venom(ss.b);
}

void main(){
Snake s;
s.a = 'A';
s.b = 'B';
serpent( s );
}

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


[Issue 3914] Struct as argument that fits in register has member accessed wrong

2010-03-11 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=3914



--- Comment #1 from Don clugd...@yahoo.com.au 2010-03-11 12:51:37 PST ---
Here's a slightly reduced test case which doesn't require any compiler flags. 
Not a regression, fails even on DMD0.165.
It's a problem with variadic function parameters and fastpar arguments.

struct SS {
char a, b, c, d;
}

void show(char[] args...) {
assert(args[0]=='A');
assert(args[1]=='L');
assert(args[2]=='D');
assert(args[3]=='O');
}

void A( SS ss ) {
show( ss.a, ss.b, ss.c, ss.d );
}

void main(){
SS ss3;
ss3.a = 'A';
ss3.b = 'L';
ss3.c = 'D';
ss3.d = 'O';
A( ss3 );
}

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


[Issue 3914] Struct as argument that fits in register has member accessed wrong

2010-03-10 Thread d-bugmail
http://d.puremagic.com/issues/show_bug.cgi?id=3914


Don clugd...@yahoo.com.au changed:

   What|Removed |Added

 CC||clugd...@yahoo.com.au
   Severity|normal  |critical


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