devirtualize-virtual-function-calls-final.cpp [plain text]
namespace Test1 {
struct A {
virtual int f() final;
};
int f(A *a) {
return a->f();
}
}
namespace Test2 {
struct A final {
virtual int f();
};
int f(A *a) {
return a->f();
}
}
namespace Test3 {
struct A {
virtual int f();
};
struct B final : A { };
int f(B *b) {
return b->f();
}
int f(B &b) {
return b.f();
}
int f(void *v) {
return static_cast<B*>(v)->f();
}
}
namespace Test4 {
struct A {
virtual void f();
};
struct B final : A {
virtual void f();
};
void f(B* d) {
static_cast<A*>(d)->f();
}
}
namespace Test5 {
struct A {
virtual void f();
};
struct B : A {
virtual void f();
};
struct C final : B {
};
void f(C* d) {
static_cast<A*>(d)->f();
}
}
namespace Test6 {
struct A {
virtual ~A();
};
struct B : public A {
virtual ~B();
};
struct C {
virtual ~C();
};
struct D final : public C, public B {
};
void f(D* d) {
static_cast<A*>(d)->~A();
}
}
namespace Test7 {
struct foo {
virtual void g() {}
};
struct bar {
virtual int f() { return 0; }
};
struct zed final : public foo, public bar {
int z;
virtual int f() {return z;}
};
int f(zed *z) {
return static_cast<bar*>(z)->f();
}
}
namespace Test8 {
struct A { virtual ~A() {} };
struct B {
int b;
virtual int foo() { return b; }
};
struct C final : A, B { };
int test(C *c) {
return static_cast<B*>(c)->foo();
}
}
namespace Test9 {
struct A {
int a;
};
struct B {
int b;
};
struct C : public B, public A {
};
struct RA {
virtual A *f() {
return 0;
}
};
struct RC final : public RA {
virtual C *f() {
C *x = new C();
x->a = 1;
x->b = 2;
return x;
}
};
A *f(RC *x) {
return static_cast<RA*>(x)->f();
}
}