[Issue 3914] Struct as argument that fits in register has member accessed wrong
http://d.puremagic.com/issues/show_bug.cgi?id=3914 Don changed: What|Removed |Added Status|NEW |RESOLVED Resolution||FIXED --- Comment #4 from Don 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
http://d.puremagic.com/issues/show_bug.cgi?id=3914 Walter Bright changed: What|Removed |Added CC||bugzi...@digitalmars.com --- Comment #3 from Walter Bright 2010-03-12 21:59:21 PST --- changeset 416 -- 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
http://d.puremagic.com/issues/show_bug.cgi?id=3914 Don changed: What|Removed |Added Keywords||patch --- Comment #2 from Don 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
http://d.puremagic.com/issues/show_bug.cgi?id=3914 --- Comment #1 from Don 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
http://d.puremagic.com/issues/show_bug.cgi?id=3914 Don 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: ---