зеркало из https://github.com/microsoft/clang-1.git
Don't emit complete constructors for abstract classes. Also, don't emit
complete destructors for abstract classes unless the destructor is virtual and thus needs to be in the vtable. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@131068 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
8db75a2b9c
Коммит
8e0397a39e
|
@ -187,7 +187,10 @@ bool CodeGenModule::TryEmitDefinitionAsAlias(GlobalDecl AliasDecl,
|
|||
void CodeGenModule::EmitCXXConstructors(const CXXConstructorDecl *D) {
|
||||
// The constructor used for constructing this as a complete class;
|
||||
// constucts the virtual bases, then calls the base constructor.
|
||||
EmitGlobal(GlobalDecl(D, Ctor_Complete));
|
||||
if (!D->getParent()->isAbstract()) {
|
||||
// We don't need to emit the complete ctor if the class is abstract.
|
||||
EmitGlobal(GlobalDecl(D, Ctor_Complete));
|
||||
}
|
||||
|
||||
// The constructor used for constructing this as a base class;
|
||||
// ignores virtual bases.
|
||||
|
@ -244,7 +247,11 @@ void CodeGenModule::EmitCXXDestructors(const CXXDestructorDecl *D) {
|
|||
|
||||
// The destructor used for destructing this as a most-derived class;
|
||||
// call the base destructor and then destructs any virtual bases.
|
||||
EmitGlobal(GlobalDecl(D, Dtor_Complete));
|
||||
if (!D->getParent()->isAbstract() || D->isVirtual()) {
|
||||
// We don't need to emit the complete ctor if the class is abstract,
|
||||
// unless the destructor is virtual and needs to be in the vtable.
|
||||
EmitGlobal(GlobalDecl(D, Dtor_Complete));
|
||||
}
|
||||
|
||||
// The destructor used for destructing this as a base class; ignores
|
||||
// virtual bases.
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
// RUN: %clang_cc1 %s -triple x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
|
||||
|
||||
// Check that we dont emit the complete constructor/destructor for this class.
|
||||
struct A {
|
||||
virtual void f() = 0;
|
||||
A();
|
||||
~A();
|
||||
};
|
||||
|
||||
// CHECK-NOT: define void @_ZN1AC1Ev
|
||||
// CHECK: define void @_ZN1AC2Ev
|
||||
// CHECK-NOT: define void @_ZN1AD1Ev
|
||||
// CHECK: define void @_ZN1AD2Ev
|
||||
A::A() { }
|
||||
|
||||
A::~A() { }
|
Загрузка…
Ссылка в новой задаче