https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80577

            Bug ID: 80577
           Summary: Avoid using adj in member function pointers
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: drepper.fsp+rhbz at gmail dot com
  Target Milestone: ---

Consider the following code:

struct foo final {
  int a = 0, b = 0;
  int get1() const { return a; }
  int get2() const { return a + b; }
};

foo f;
int (foo::*mfp)() const = &foo::get1;

int get()
{
  return (f.*mfp)();
}

When compiled get() looks on x86-64 like this:

        movq    mfp+8(%rip), %rax
        leaq    f(%rax), %rdi
        jmp     *mfp(%rip)

The compiler knows the type 'foo'.  It can determine that there is no multiple
inheritence.  This means that the adj field in the member function pointer will
always be zero.  Hence the generated code should be

        movl    $f, %esi
        jmp     *mfp(%rip)

Reply via email to