give PATypeHolder an explicit copy ctor which initializes the type pointer,
authorChris Lattner <sabre@nondot.org>
Tue, 29 Jun 2010 19:20:38 +0000 (19:20 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 29 Jun 2010 19:20:38 +0000 (19:20 +0000)
and make PATypeHolder work with null pointers.

The implicitly generated one didn't work on numerous levels, but was still
accepted, allowing all sorts of bugs with default constructed pa type holders.

Previously, they "sort of" worked if they were default constructed and then
destructed.  Now they really work, and you can even default construct one,
then assign to it, amazing.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@107195 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/AbstractTypeUser.h
include/llvm/Type.h

index b6cceb4011ad3ff099bb97644f5c2c05cf18a298..81f5c5c7680d87ef4b6f8b0fe76cc3963923287d 100644 (file)
@@ -146,6 +146,7 @@ class PATypeHolder {
   mutable const Type *Ty;
   void destroy();
 public:
+  PATypeHolder() : Ty(0) {}
   PATypeHolder(const Type *ty) : Ty(ty) {
     addRef();
   }
@@ -153,7 +154,7 @@ public:
     addRef();
   }
 
-  ~PATypeHolder() { if (Ty) dropRef(); }
+  ~PATypeHolder() { dropRef(); }
 
   operator Type *() const { return get(); }
   Type *get() const;
index 52229acb32386593f2c350574125c99903b3cc12..617ef69de467a3511e06e2de833d970642d5036e 100644 (file)
@@ -504,19 +504,19 @@ inline void PATypeHandle::removeUser() {
 /// reference to the type.
 ///
 inline Type* PATypeHolder::get() const {
+  if (Ty == 0) return 0;
   const Type *NewTy = Ty->getForwardedType();
   if (!NewTy) return const_cast<Type*>(Ty);
   return *const_cast<PATypeHolder*>(this) = NewTy;
 }
 
 inline void PATypeHolder::addRef() {
-  assert(Ty && "Type Holder has a null type!");
-  if (Ty->isAbstract())
+  if (Ty && Ty->isAbstract())
     Ty->addRef();
 }
 
 inline void PATypeHolder::dropRef() {
-  if (Ty->isAbstract())
+  if (Ty && Ty->isAbstract())
     Ty->dropRef();
 }