2012-06-26 17:45:31 +00:00
|
|
|
// RUN: %clang_cc1 -std=c++11 %s -emit-llvm -o - | FileCheck %s
|
2010-10-27 13:28:46 +00:00
|
|
|
|
|
|
|
namespace Test1 {
|
|
|
|
struct A {
|
2011-01-23 21:07:30 +00:00
|
|
|
virtual int f() final;
|
2010-10-27 13:28:46 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// CHECK: define i32 @_ZN5Test11fEPNS_1AE
|
2010-10-27 13:34:43 +00:00
|
|
|
int f(A *a) {
|
2011-01-23 21:07:30 +00:00
|
|
|
// CHECK: call i32 @_ZN5Test11A1fEv
|
2010-10-27 13:34:43 +00:00
|
|
|
return a->f();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace Test2 {
|
2011-01-23 21:07:30 +00:00
|
|
|
struct A final {
|
|
|
|
virtual int f();
|
2010-10-27 13:34:43 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// CHECK: define i32 @_ZN5Test21fEPNS_1AE
|
|
|
|
int f(A *a) {
|
2011-01-23 21:07:30 +00:00
|
|
|
// CHECK: call i32 @_ZN5Test21A1fEv
|
2010-10-27 13:28:46 +00:00
|
|
|
return a->f();
|
|
|
|
}
|
|
|
|
}
|
2011-01-29 03:52:01 +00:00
|
|
|
|
|
|
|
namespace Test3 {
|
|
|
|
struct A {
|
|
|
|
virtual int f();
|
|
|
|
};
|
|
|
|
|
|
|
|
struct B final : A { };
|
|
|
|
|
|
|
|
// CHECK: define i32 @_ZN5Test31fEPNS_1BE
|
|
|
|
int f(B *b) {
|
|
|
|
// CHECK: call i32 @_ZN5Test31A1fEv
|
|
|
|
return b->f();
|
|
|
|
}
|
2011-01-29 05:04:11 +00:00
|
|
|
|
|
|
|
// CHECK: define i32 @_ZN5Test31fERNS_1BE
|
|
|
|
int f(B &b) {
|
|
|
|
// CHECK: call i32 @_ZN5Test31A1fEv
|
|
|
|
return b.f();
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: define i32 @_ZN5Test31fEPv
|
|
|
|
int f(void *v) {
|
|
|
|
// CHECK: call i32 @_ZN5Test31A1fEv
|
|
|
|
return static_cast<B*>(v)->f();
|
|
|
|
}
|
2011-01-29 03:52:01 +00:00
|
|
|
}
|
2012-06-26 17:45:31 +00:00
|
|
|
|
|
|
|
namespace Test4 {
|
|
|
|
struct A {
|
|
|
|
virtual void f();
|
|
|
|
};
|
|
|
|
|
|
|
|
struct B final : A {
|
|
|
|
virtual void f();
|
|
|
|
};
|
|
|
|
|
|
|
|
// CHECK: define void @_ZN5Test41fEPNS_1BE
|
|
|
|
void f(B* d) {
|
|
|
|
// CHECK: call void @_ZN5Test41B1fEv
|
|
|
|
static_cast<A*>(d)->f();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace Test5 {
|
|
|
|
struct A {
|
|
|
|
virtual void f();
|
|
|
|
};
|
|
|
|
|
|
|
|
struct B : A {
|
|
|
|
virtual void f();
|
|
|
|
};
|
|
|
|
|
|
|
|
struct C final : B {
|
|
|
|
};
|
|
|
|
|
|
|
|
// CHECK: define void @_ZN5Test51fEPNS_1CE
|
|
|
|
void f(C* d) {
|
|
|
|
// CHECK: call void @_ZN5Test51B1fEv
|
|
|
|
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 {
|
|
|
|
};
|
|
|
|
|
|
|
|
// CHECK: define void @_ZN5Test61fEPNS_1DE
|
|
|
|
void f(D* d) {
|
|
|
|
// CHECK: call void @_ZN5Test61DD1Ev
|
|
|
|
static_cast<A*>(d)->~A();
|
|
|
|
}
|
|
|
|
}
|