Don't leak! Always remove oneself as a listener after adding oneself.
authorNick Lewycky <nicholas@mxc.ca>
Mon, 14 Sep 2009 00:36:52 +0000 (00:36 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Mon, 14 Sep 2009 00:36:52 +0000 (00:36 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81736 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/Verifier.cpp

index 9f7be43b54aa6292784987f7fd1632b2515501bc..7b2afde0a0e8a37aa62122a7431b14a81d31ac8b 100644 (file)
@@ -57,7 +57,7 @@
 #include "llvm/Support/CallSite.h"
 #include "llvm/Support/CFG.h"
 #include "llvm/Support/InstVisitor.h"
-#include "llvm/ADT/SmallSet.h"
+#include "llvm/ADT/SetVector.h"
 #include "llvm/ADT/SmallPtrSet.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringExtras.h"
@@ -108,25 +108,34 @@ static const PassInfo *const PreVerifyID = &PreVer;
 
 namespace {
   struct TypeSet : public AbstractTypeUser {
-    SmallSet<const Type *, 16> Types;
+    SmallSetVector<const Type *, 16> Types;
 
     /// Insert a type into the set of types.
     bool insert(const Type *Ty) {
-      bool Inserted = Types.insert(Ty);
-      if (!Inserted)
+      if (!Types.insert(Ty))
         return false;
-
       if (Ty->isAbstract())
         Ty->addAbstractTypeUser(this);
       return true;
     }
 
+    // Remove ourselves as abstract type listeners for any types that remain
+    // abstract when the TypeSet is destroyed.
+    ~TypeSet() {
+      for (SmallSetVector<const Type *, 16>::iterator I = Types.begin(),
+             E = Types.end(); I != E; ++I) {
+        const Type *Ty = *I;
+        if (Ty->isAbstract())
+          Ty->removeAbstractTypeUser(this);
+      }
+    }
+
     // Abstract type user interface.
 
     /// Remove types from the set when refined. Do not insert the type it was
     /// refined to because that type hasn't been verified yet.
     void refineAbstractType(const DerivedType *OldTy, const Type *NewTy) {
-      Types.erase(OldTy);
+      Types.remove(OldTy);
       OldTy->removeAbstractTypeUser(this);
     }
     void typeBecameConcrete(const DerivedType *AbsTy) {}