[cfe-commits] r112905 - in /cfe/trunk: lib/AST/DeclCXX.cpp lib/AST/ExprCXX.cpp lib/Parse/ParseExpr.cpp test/SemaCXX/type-traits.cpp
Sebastian Redl
sebastian.redl at getdesigned.at
Thu Sep 2 16:19:42 PDT 2010
Author: cornedbee
Date: Thu Sep 2 18:19:42 2010
New Revision: 112905
URL: http://llvm.org/viewvc/llvm-project?rev=112905&view=rev
Log:
Implement __has_virtual_destructor. Patch by Steven Watanabe.
Modified:
cfe/trunk/lib/AST/DeclCXX.cpp
cfe/trunk/lib/AST/ExprCXX.cpp
cfe/trunk/lib/Parse/ParseExpr.cpp
cfe/trunk/test/SemaCXX/type-traits.cpp
Modified: cfe/trunk/lib/AST/DeclCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=112905&r1=112904&r2=112905&view=diff
==============================================================================
--- cfe/trunk/lib/AST/DeclCXX.cpp (original)
+++ cfe/trunk/lib/AST/DeclCXX.cpp Thu Sep 2 18:19:42 2010
@@ -609,7 +609,8 @@
DeclContext::lookup_const_iterator I, E;
llvm::tie(I, E) = lookup(Name);
- assert(I != E && "Did not find a destructor!");
+ if (I == E)
+ return 0;
CXXDestructorDecl *Dtor = cast<CXXDestructorDecl>(*I);
assert(++I == E && "Found more than one destructor!");
Modified: cfe/trunk/lib/AST/ExprCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprCXX.cpp?rev=112905&r1=112904&r2=112905&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprCXX.cpp (original)
+++ cfe/trunk/lib/AST/ExprCXX.cpp Thu Sep 2 18:19:42 2010
@@ -488,6 +488,16 @@
}
}
return false;
+ case UTT_HasVirtualDestructor:
+ // http://gcc.gnu.org/onlinedocs/gcc/Type-Traits.html:
+ // If type is a class type with a virtual destructor ([class.dtor])
+ // then the trait is true, else it is false.
+ if (const RecordType *Record = QueriedType->getAs<RecordType>()) {
+ CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl());
+ if (CXXDestructorDecl *Destructor = RD->getDestructor())
+ return Destructor->isVirtual();
+ }
+ return false;
}
}
Modified: cfe/trunk/lib/Parse/ParseExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParseExpr.cpp?rev=112905&r1=112904&r2=112905&view=diff
==============================================================================
--- cfe/trunk/lib/Parse/ParseExpr.cpp (original)
+++ cfe/trunk/lib/Parse/ParseExpr.cpp Thu Sep 2 18:19:42 2010
@@ -533,7 +533,7 @@
/// '__has_trivial_copy' [TODO]
/// '__has_trivial_constructor'
/// '__has_trivial_destructor'
-/// '__has_virtual_destructor' [TODO]
+/// '__has_virtual_destructor'
/// '__is_abstract' [TODO]
/// '__is_class'
/// '__is_empty' [TODO]
@@ -903,6 +903,7 @@
case tok::kw___has_nothrow_assign:
case tok::kw___has_nothrow_copy:
case tok::kw___has_nothrow_constructor:
+ case tok::kw___has_virtual_destructor:
return ParseUnaryTypeTrait();
case tok::at: {
Modified: cfe/trunk/test/SemaCXX/type-traits.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/type-traits.cpp?rev=112905&r1=112904&r2=112905&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/type-traits.cpp (original)
+++ cfe/trunk/test/SemaCXX/type-traits.cpp Thu Sep 2 18:19:42 2010
@@ -61,6 +61,10 @@
HasMultipleNoThrowCopy(volatile HasMultipleNoThrowCopy&) throw();
};
+struct HasVirtDest { virtual ~HasVirtDest(); };
+struct DerivedVirtDest : HasVirtDest {};
+typedef HasVirtDest VirtDestAr[1];
+
void is_pod()
{
int t01[T(__is_pod(int))];
@@ -359,3 +363,28 @@
int t19[T(__has_nothrow_constructor(HasNoThrowConstructor))];
int t20[F(__has_nothrow_constructor(HasNoThrowConstructorWithArgs))];
}
+
+void has_virtual_destructor() {
+ int t01[F(__has_virtual_destructor(Int))];
+ int t02[F(__has_virtual_destructor(IntAr))];
+ int t03[F(__has_virtual_destructor(Union))];
+ int t04[F(__has_virtual_destructor(UnionAr))];
+ int t05[F(__has_virtual_destructor(POD))];
+ int t06[F(__has_virtual_destructor(Derives))];
+ int t07[F(__has_virtual_destructor(ConstIntAr))];
+ int t08[F(__has_virtual_destructor(ConstIntArAr))];
+ int t09[F(__has_virtual_destructor(HasDest))];
+ int t10[F(__has_virtual_destructor(HasPriv))];
+ int t11[F(__has_virtual_destructor(HasCons))];
+ int t12[F(__has_virtual_destructor(HasRef))];
+ int t13[F(__has_virtual_destructor(HasCopy))];
+ int t14[F(__has_virtual_destructor(IntRef))];
+ int t15[F(__has_virtual_destructor(HasCopyAssign))];
+ int t16[F(__has_virtual_destructor(const Int))];
+ int t17[F(__has_virtual_destructor(NonPODAr))];
+ int t18[F(__has_virtual_destructor(VirtAr))];
+
+ int t19[T(__has_virtual_destructor(HasVirtDest))];
+ int t20[T(__has_virtual_destructor(DerivedVirtDest))];
+ int t21[F(__has_virtual_destructor(VirtDestAr))];
+}
More information about the cfe-commits
mailing list