When presented with the attached code, gcc (taken from CVS on Dec. 6 2004)
generates bad code for the function callpmf().  The code it generates never
calls the member function, so the exit status of this program is garbage (I get
39).  No diagnostic is issued when compiling.

If you replace the declaration of A with a trivial definition ("class A{};"), it
generates the correct code.

gcc-3.4.2 and earlier generated the correct code regardless of whether A was an
incomplete type.  

----
class A;

class B {
public:
        int memfn() { return 1; }
};

int callpmf(A* a_ptr, int (A::*memfn_ptr)()) {
        return (a_ptr->*memfn_ptr)();
}

int main() {
        B b;
        return callpmf((A*)&b, (int (A::*)())&B::memfn);
}
----
This bug looks related to 15684, which seems to be debating whether this is a
legal thing to do or not.  If it is decided that this is illegal, a diagnostic
would be helpful.

-- 
           Summary: pointer-to-member called on incomplete type generates
                    bad code
           Product: gcc
           Version: 4.0.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: efrias at syncad dot com
                CC: gcc-bugs at gcc dot gnu dot org
  GCC host triplet: i686-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18933

Reply via email to