https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80660
Bug ID: 80660
Summary: Member function pointer optimization affected by
incompatible virtual function
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;
int b = 0;
void set_a(int p) { a = p; }
void set_b(int p) { b = p; }
#ifdef VIRT
virtual int get_a() const { return a; }
#endif
};
void (foo::*set)(int);
foo fobj1;
void bar1(int a) {
(fobj1.*set)(a);
}
When compiling with optimization and VIRT not defined the code generated for
bar1 does correctly so elide the test for a virtual function and saves code and
time at execution time.
Adding any virtual function (such as by defining VIRT) changes this. All of
the sudden the entire member function pointer call sequence is emitted.
This is unnecessary, though, since the present virtual function is incompatible
with the member function pointer 'set'. Therefore the generated code should be
the same, with or without get_a defined.