зеркало из https://github.com/microsoft/clang-1.git
We can generate constructors/destructors with base classes and non-trivial fields just fine now.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80701 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
cc58eae181
Коммит
174754cda4
|
@ -719,28 +719,7 @@ void CodeGenFunction::EmitCXXDeleteExpr(const CXXDeleteExpr *E) {
|
||||||
EmitBlock(DeleteEnd);
|
EmitBlock(DeleteEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool canGenerateCXXstructor(const CXXRecordDecl *RD,
|
|
||||||
ASTContext &Context) {
|
|
||||||
// The class has base classes - we don't support that right now.
|
|
||||||
if (RD->getNumBases() > 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for (CXXRecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end();
|
|
||||||
I != E; ++I) {
|
|
||||||
// We don't support ctors for fields that aren't POD.
|
|
||||||
if (!I->getType()->isPODType())
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void CodeGenModule::EmitCXXConstructors(const CXXConstructorDecl *D) {
|
void CodeGenModule::EmitCXXConstructors(const CXXConstructorDecl *D) {
|
||||||
if (!canGenerateCXXstructor(D->getParent(), getContext())) {
|
|
||||||
ErrorUnsupported(D, "C++ constructor", true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
EmitGlobal(GlobalDecl(D, Ctor_Complete));
|
EmitGlobal(GlobalDecl(D, Ctor_Complete));
|
||||||
EmitGlobal(GlobalDecl(D, Ctor_Base));
|
EmitGlobal(GlobalDecl(D, Ctor_Base));
|
||||||
}
|
}
|
||||||
|
@ -778,11 +757,6 @@ const char *CodeGenModule::getMangledCXXCtorName(const CXXConstructorDecl *D,
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeGenModule::EmitCXXDestructors(const CXXDestructorDecl *D) {
|
void CodeGenModule::EmitCXXDestructors(const CXXDestructorDecl *D) {
|
||||||
if (!canGenerateCXXstructor(D->getParent(), getContext())) {
|
|
||||||
ErrorUnsupported(D, "C++ destructor", true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
EmitCXXDestructor(D, Dtor_Complete);
|
EmitCXXDestructor(D, Dtor_Complete);
|
||||||
EmitCXXDestructor(D, Dtor_Base);
|
EmitCXXDestructor(D, Dtor_Base);
|
||||||
}
|
}
|
||||||
|
@ -1613,6 +1587,7 @@ void CodeGenFunction::SynthesizeCXXCopyAssignment(const CXXMethodDecl *CD,
|
||||||
|
|
||||||
/// EmitCtorPrologue - This routine generates necessary code to initialize
|
/// EmitCtorPrologue - This routine generates necessary code to initialize
|
||||||
/// base classes and non-static data members belonging to this constructor.
|
/// base classes and non-static data members belonging to this constructor.
|
||||||
|
/// FIXME: This needs to take a CXXCtorType.
|
||||||
void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD) {
|
void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD) {
|
||||||
const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(CD->getDeclContext());
|
const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(CD->getDeclContext());
|
||||||
// FIXME: Add vbase initialization
|
// FIXME: Add vbase initialization
|
||||||
|
@ -1766,6 +1741,7 @@ void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD) {
|
||||||
/// EmitDtorEpilogue - Emit all code that comes at the end of class's
|
/// EmitDtorEpilogue - Emit all code that comes at the end of class's
|
||||||
/// destructor. This is to call destructors on members and base classes
|
/// destructor. This is to call destructors on members and base classes
|
||||||
/// in reverse order of their construction.
|
/// in reverse order of their construction.
|
||||||
|
/// FIXME: This needs to take a CXXDtorType.
|
||||||
void CodeGenFunction::EmitDtorEpilogue(const CXXDestructorDecl *DD) {
|
void CodeGenFunction::EmitDtorEpilogue(const CXXDestructorDecl *DD) {
|
||||||
const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(DD->getDeclContext());
|
const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(DD->getDeclContext());
|
||||||
assert(!ClassDecl->isPolymorphic() &&
|
assert(!ClassDecl->isPolymorphic() &&
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
// RUN: clang-cc %s -emit-llvm -o -
|
||||||
|
struct A {
|
||||||
|
int a;
|
||||||
|
|
||||||
|
~A();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Base with non-trivial destructor
|
||||||
|
struct B : A {
|
||||||
|
~B();
|
||||||
|
};
|
||||||
|
|
||||||
|
B::~B() { }
|
||||||
|
|
||||||
|
// Field with non-trivial destructor
|
||||||
|
struct C {
|
||||||
|
A a;
|
||||||
|
|
||||||
|
~C();
|
||||||
|
};
|
||||||
|
|
||||||
|
C::~C() { }
|
Загрузка…
Ссылка в новой задаче