summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/DeclCXX.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2009-07-23 23:49:00 +0000
committerDouglas Gregor <dgregor@apple.com>2009-07-23 23:49:00 +0000
commit79f83eda848b474a7839220bc98306ac8eb56c9f (patch)
treed32df6f4ff893e9c5f80ac484e74375327b63f96 /clang/lib/AST/DeclCXX.cpp
parent91ade1419748a8b092a6e634d2a126a01fb05f2d (diff)
downloadbcm5719-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.cpp25
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,
OpenPOWER on IntegriCloud