]> granicus.if.org Git - clang/commitdiff
Minor mod. per Doug's comment.
authorFariborz Jahanian <fjahanian@apple.com>
Wed, 22 Jul 2009 00:42:46 +0000 (00:42 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Wed, 22 Jul 2009 00:42:46 +0000 (00:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@76708 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclCXX.h
lib/AST/DeclCXX.cpp

index 14a3bd712145f26709447ea49422f3fb781e13f9..ffacc0e1f33516679361596e87e3757e6e234ff1 100644 (file)
@@ -890,6 +890,12 @@ public:
 /// };
 /// @endcode
 class CXXDestructorDecl : public CXXMethodDecl {
+  enum KindOfObjectToDestroy {
+    VBASE = 0x1,
+    DRCTNONVBASE = 0x2,
+    ANYBASE = 0x3
+  };
+
   /// ImplicitlyDefined - Whether this destructor was implicitly
   /// defined by the compiler. When false, the destructor was defined
   /// by the user. In C++03, this flag will have the same value as
@@ -900,7 +906,10 @@ class CXXDestructorDecl : public CXXMethodDecl {
   
   /// Support for base and member destruction.
   /// BaseOrMemberDestructions - The arguments used to destruct the base 
-  /// or member.
+  /// or member. Each uintptr_t value represents one of base classes (either
+  /// virtual or direct non-virtual base), or non-static data member
+  /// to be destroyed. The low two bits encode the kind of object
+  /// being destroyed.
   uintptr_t *BaseOrMemberDestructions;
   unsigned NumBaseOrMemberDestructions;
   
@@ -975,21 +984,21 @@ public:
   
   /// isVbaseToDestroy - returns true, if object is virtual base.
   bool isVbaseToDestroy(uintptr_t Vbase) const {
-    return (Vbase & 0x1) != 0;
+    return (Vbase & VBASE) != 0;
   }
   /// isDirectNonVBaseToDestroy - returns true, if object is direct non-virtual
   /// base.
   bool isDirectNonVBaseToDestroy(uintptr_t DrctNonVbase) const {
-    return (DrctNonVbase & 0x2) != 0;
+    return (DrctNonVbase & DRCTNONVBASE) != 0;
   }
   /// isAnyBaseToDestroy - returns true, if object is any base (virtual or 
   /// direct non-virtual)
   bool isAnyBaseToDestroy(uintptr_t AnyBase) const {
-    return (AnyBase & 0x3) != 0;
+    return (AnyBase & ANYBASE) != 0;
   }
   /// isMemberToDestroy - returns true if object is a non-static data member.
   bool isMemberToDestroy(uintptr_t Member) const {
-    return (Member & 0x3)  == 0;
+    return (Member & ANYBASE)  == 0;
   }
   /// getAnyBaseClassToDestroy - Get the type for the given base class object.
   Type *getAnyBaseClassToDestroy(uintptr_t Base) const {
index 2f8a1ebd7e3520f73d3e710ad3c654afcb174615..7ba2394b0427ef9e1f4f5181e70e721b6f0f69a3 100644 (file)
@@ -498,7 +498,7 @@ CXXDestructorDecl::computeBaseOrMembersToDestroy(ASTContext &C) {
     if (BaseClassDecl->hasTrivialDestructor())
       continue;
     uintptr_t Member = 
-      reinterpret_cast<uintptr_t>(VBase->getType().getTypePtr()) | 0x1;
+      reinterpret_cast<uintptr_t>(VBase->getType().getTypePtr()) | VBASE;
     AllToDestruct.push_back(Member);
   }
   for (CXXRecordDecl::base_class_iterator Base =
@@ -513,7 +513,7 @@ CXXDestructorDecl::computeBaseOrMembersToDestroy(ASTContext &C) {
       continue;
     
     uintptr_t Member = 
-      reinterpret_cast<uintptr_t>(Base->getType().getTypePtr()) | 0x2;
+      reinterpret_cast<uintptr_t>(Base->getType().getTypePtr()) | DRCTNONVBASE;
     AllToDestruct.push_back(Member);
   }