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

            Bug ID: 81973
           Summary: Aliased virtual methods are treated as undefined, so
                    the vtable is not generated
           Product: gcc
           Version: 7.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: blaffablaffa at gmail dot com
  Target Milestone: ---

test case:


        #include <iostream>
        using namespace std;

        struct b{
                int a;
                virtual void f(){
                        cout<<__PRETTY_FUNCTION__<<' '<<a<<endl;
                }
        };

        struct s : b{
        #ifdef VIRT_ALIAS
                virtual void f() __attribute__ ((alias ("s_f_alias")));
        #endif
                void g() __attribute__ ((alias ("s_g_alias")));
        };

        extern "C"{
        void s_f_alias(s* this_){
                cout<<__PRETTY_FUNCTION__<<' '<<this_->a<<endl;
        }
        void s_g_alias(s* this_){
                cout<<__PRETTY_FUNCTION__<<' '<<this_->a<<endl;
        }
        }

        int main(){
                s a;
                a.a = 123;
                a.f();
                a.g();
        }



Compiling without -DVIRT_ALIAS works, output is:
virtual void b::f() 123
void s_g_alias(s*) 123

Compiling with -DVIRT_ALIAS gives an error at link time because s::f is treated
as not defined, even though it would be possible to use s_f_alias as the
definition and put its pointer in the vtable. Expected output is:
void s_f_alias(s*) 123
void s_g_alias(s*) 123

Reply via email to