зеркало из 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);
|
||||
}
|
||||
|
||||
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) {
|
||||
if (!canGenerateCXXstructor(D->getParent(), getContext())) {
|
||||
ErrorUnsupported(D, "C++ constructor", true);
|
||||
return;
|
||||
}
|
||||
|
||||
EmitGlobal(GlobalDecl(D, Ctor_Complete));
|
||||
EmitGlobal(GlobalDecl(D, Ctor_Base));
|
||||
}
|
||||
|
@ -778,11 +757,6 @@ const char *CodeGenModule::getMangledCXXCtorName(const CXXConstructorDecl *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_Base);
|
||||
}
|
||||
|
@ -1613,6 +1587,7 @@ void CodeGenFunction::SynthesizeCXXCopyAssignment(const CXXMethodDecl *CD,
|
|||
|
||||
/// EmitCtorPrologue - This routine generates necessary code to initialize
|
||||
/// base classes and non-static data members belonging to this constructor.
|
||||
/// FIXME: This needs to take a CXXCtorType.
|
||||
void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD) {
|
||||
const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(CD->getDeclContext());
|
||||
// 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
|
||||
/// destructor. This is to call destructors on members and base classes
|
||||
/// in reverse order of their construction.
|
||||
/// FIXME: This needs to take a CXXDtorType.
|
||||
void CodeGenFunction::EmitDtorEpilogue(const CXXDestructorDecl *DD) {
|
||||
const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(DD->getDeclContext());
|
||||
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() { }
|
Загрузка…
Ссылка в новой задаче