1 struct A 2 { 3 virtual void foo(); 4 virtual void bar(); 5 }; 6 foo()7void A::foo() { } // keep bar()8void A::bar() { } // lose 9 10 struct B : public A 11 { 12 virtual void foo(); 13 }; 14 foo()15void B::foo() { } // keep 16 17 void _start() __asm__("_start"); // keep 18 void start() __asm__("start"); // some toolchains use this name. 19 20 A a; // keep 21 B b; getme()22A *getme() { return &a; } // keep 23 _start()24void _start() 25 { 26 getme()->foo(); 27 #ifdef __GNUC__ 28 #if (__GNUC__ == 2 && __GNUC_MINOR__ < 96) 29 // gcc-2.95.2 gets this test wrong, and loses B::foo(). 30 // Cheat. After all, we aren't trying to test the compiler here. 31 b.foo(); 32 #endif 33 #endif 34 } 35 start()36void start () 37 { 38 _start (); 39 } 40 41 // In addition, keep A's virtual table. 42 43 // We'll wind up keeping `b' and thus B's virtual table because 44 // `a' and `b' are both referenced from the constructor function. 45 __main()46extern "C" void __main() { } 47