[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