From adc3142fdd1142e24b95260e14815b9a4abd0a1f Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Mon, 14 Sep 2009 00:36:52 +0000 Subject: [PATCH] Don't leak! Always remove oneself as a listener after adding oneself. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81736 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/VMCore/Verifier.cpp | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/VMCore/Verifier.cpp b/lib/VMCore/Verifier.cpp index 9f7be43b54a..7b2afde0a0e 100644 --- a/lib/VMCore/Verifier.cpp +++ b/lib/VMCore/Verifier.cpp @@ -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 Types; + SmallSetVector 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::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) {}