digitalmars.D.bugs - [Issue 3500] New: Program behaves differently with -inline
- d-bugmail puremagic.com (45/45) Nov 12 2009 http://d.puremagic.com/issues/show_bug.cgi?id=3500
- d-bugmail puremagic.com (24/24) Nov 12 2009 http://d.puremagic.com/issues/show_bug.cgi?id=3500
- d-bugmail puremagic.com (10/10) Jan 04 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3500
- d-bugmail puremagic.com (8/8) Jan 18 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3500
- d-bugmail puremagic.com (56/56) Feb 03 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3500
- d-bugmail puremagic.com (10/10) Feb 06 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3500
- d-bugmail puremagic.com (11/11) Mar 08 2010 http://d.puremagic.com/issues/show_bug.cgi?id=3500
http://d.puremagic.com/issues/show_bug.cgi?id=3500 Summary: Program behaves differently with -inline Product: D Version: 2.035 Platform: Other OS/Version: All Status: NEW Keywords: wrong-code Severity: normal Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: nfxjfg gmail.com The following program behaves differently whether you pass -inline to dmd or not. The correct output is "A::x()", but with -inline, it outputs "B::x()". Conclusion: the dmd inliner must be buggy. I confirmed this with: - dmd 1.051/Tango - dmd 2.035/Phobos Command line, failing binary: dmd bug.d -inline Correct binary: dmd bug.d Test using Tango: import tango.util.log.Trace; class A { void x() { Trace.formatln("A::x()"); } } class B : A { override void x() { Trace.formatln("B::x()"); } private void do_x() { super.x(); } } void main() { B b = new B(); b.do_x(); } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Nov 12 2009
http://d.puremagic.com/issues/show_bug.cgi?id=3500 D2 testcase. import std.stdio; class A { void x() { writefln("A::x()"); } } class B : A { override void x() { writefln("B::x()"); } private void do_x() { super.x(); } } void main() { B b = new B(); b.do_x(); } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Nov 12 2009
http://d.puremagic.com/issues/show_bug.cgi?id=3500 Don <clugdbug yahoo.com.au> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |clugdbug yahoo.com.au This may be related to bug 2127. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jan 04 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3500 Don <clugdbug yahoo.com.au> changed: What |Removed |Added ---------------------------------------------------------------------------- Severity|normal |critical -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jan 18 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3500 Don <clugdbug yahoo.com.au> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |patch Version|2.035 |1.00 Summary|Program behaves differently |super behaves differently |with -inline |with -inline The thing that isn't working correctly is this line from the 'Expressions' page in the spec: "If a member function is called with an explicit reference to super, a non-virtual call is made." This bug applies to D1 as well (DMD1.00 fails). Cause: direct calls are normally implemented in e2ir.c. If CallExp::toElem() finds TOKsuper, it makes it a non-virtual call. But the direct call is a little bit of a hack (there's a "//BUG: fix" comment in FuncExp::toElem()). inline.c, SuperExp::doInline() changes it from 'super' to a variable, so e2ir can't find it. This patch disables inlining for direct 'super' calls. Allowing them to be inlined would be a quite difficult, I think. Index: inline.c =================================================================== --- inline.c (revision 362) +++ inline.c (working copy) -275,6 +275,10 int CallExp::inlineCost(InlineCostState *ics) { + // Bugzilla 3500: super.func() calls must be devirtualized, and the inliner + // can't handle that at present. + if (e1->op == TOKdotvar && ((DotVarExp *)e1)->e1->op == TOKsuper) + return COST_MAX; return 1 + e1->inlineCost(ics) + arrayInlineCost(ics, arguments); } ------------------------------------------------- Test case without any imports: -------------------------------- class A { void x() { } } class B : A { override void x() { assert(0); } final void do_x() { super.x(); } } void main() { B b = new B(); b.do_x(); } -------------------------------- -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 03 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3500 Walter Bright <bugzilla digitalmars.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |bugzilla digitalmars.com 00:03:16 PST --- changeset 373 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Feb 06 2010
http://d.puremagic.com/issues/show_bug.cgi?id=3500 Walter Bright <bugzilla digitalmars.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |FIXED 22:21:10 PST --- Fixed dmd 1.057 and 2.041 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Mar 08 2010