diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-07-23 23:49:00 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-07-23 23:49:00 +0000 |
commit | 79f83eda848b474a7839220bc98306ac8eb56c9f (patch) | |
tree | d32df6f4ff893e9c5f80ac484e74375327b63f96 /clang/lib/AST/DeclCXX.cpp | |
parent | 91ade1419748a8b092a6e634d2a126a01fb05f2d (diff) | |
download | bcm5719-llvm-79f83eda848b474a7839220bc98306ac8eb56c9f.tar.gz bcm5719-llvm-79f83eda848b474a7839220bc98306ac8eb56c9f.zip |
This patch fixes the implementations of the __has_trivial_destructor
and __has_trivial_constructor builtin pseudo-functions and
additionally implements __has_trivial_copy and __has_trivial_assign,
from John McCall!
llvm-svn: 76916
Diffstat (limited to 'clang/lib/AST/DeclCXX.cpp')
-rw-r--r-- | clang/lib/AST/DeclCXX.cpp | 25 |
1 files changed, 9 insertions, 16 deletions
diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp index 7b5a29028c4..4d861be9fd5 100644 --- a/clang/lib/AST/DeclCXX.cpp +++ b/clang/lib/AST/DeclCXX.cpp @@ -537,14 +537,11 @@ CXXDestructorDecl::computeBaseOrMembersToDestroy(ASTContext &C) { // non-static data members. for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(), E = ClassDecl->field_end(); Field != E; ++Field) { - QualType FieldType = C.getCanonicalType((*Field)->getType()); - while (const ArrayType *AT = C.getAsArrayType(FieldType)) - FieldType = AT->getElementType(); + QualType FieldType = C.getBaseElementType((*Field)->getType()); - if (FieldType->getAsRecordType()) { + if (const RecordType* RT = FieldType->getAsRecordType()) { // Skip over virtual bases which have trivial destructors. - CXXRecordDecl *BaseClassDecl - = cast<CXXRecordDecl>(FieldType->getAsRecordType()->getDecl()); + CXXRecordDecl *BaseClassDecl = cast<CXXRecordDecl>(RT->getDecl()); if (BaseClassDecl->hasTrivialDestructor()) continue; uintptr_t Member = reinterpret_cast<uintptr_t>(*Field); @@ -640,16 +637,12 @@ CXXConstructorDecl::setBaseOrMemberInitializers( AllToInit.push_back(AllBaseFields[Key]); continue; } - QualType FieldType = C.getCanonicalType((*Field)->getType()); - while (const ArrayType *AT = C.getAsArrayType(FieldType)) - FieldType = AT->getElementType(); - - if (FieldType->getAsRecordType()) { - CXXConstructorDecl *Ctor = 0; - if (CXXRecordDecl *FieldClassDecl = - dyn_cast<CXXRecordDecl>(FieldType->getAsRecordType()->getDecl())) - Ctor = FieldClassDecl->getDefaultConstructor(C); - if (!Ctor && !FieldType->isDependentType()) + + QualType FT = C.getBaseElementType((*Field)->getType()); + if (const RecordType* RT = FT->getAsRecordType()) { + CXXConstructorDecl *Ctor = + cast<CXXRecordDecl>(RT->getDecl())->getDefaultConstructor(C); + if (!Ctor && !FT->isDependentType()) Fields.push_back(*Field); CXXBaseOrMemberInitializer *Member = new (C) CXXBaseOrMemberInitializer((*Field), 0, 0, |