[Issue 3914] Struct as argument that fits in register has member accessed wrong
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
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
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
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: ---