[Issue 3500] super behaves differently with -inline

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Feb 3 00:19:22 PST 2010


http://d.puremagic.com/issues/show_bug.cgi?id=3500


Don <clugdbug at 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


--- Comment #3 from Don <clugdbug at yahoo.com.au> 2010-02-03 00:19:21 PST ---
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: -------


More information about the Digitalmars-d-bugs mailing list