Deallocate the BasePaths structure that we allocate for LookupResult.

llvm-svn: 62250
This commit is contained in:
Douglas Gregor 2009-01-15 02:19:31 +00:00
parent bf78b20490
commit 41c8ba80de
2 changed files with 47 additions and 2 deletions

View File

@ -638,7 +638,11 @@ public:
/// by the LookupResult. Last is non-zero to indicate that the
/// ambiguity is caused by two names found in base class
/// subobjects of different types.
AmbiguousLookup
AmbiguousLookup,
/// We've moved from this object. There should not be any
/// attempts to look at its state.
Dead
} StoredKind;
/// The first lookup result, whose contents depend on the kind of
@ -706,7 +710,9 @@ public:
AmbiguousBaseSubobjects
};
LookupResult() : StoredKind(SingleDecl), First(0), Last(0), Context(0) { }
LookupResult() : StoredKind(Dead), First(0), Last(0), Context(0) { }
LookupResult(const LookupResult& Other);
LookupResult(ASTContext &Context, Decl *D)
: StoredKind(SingleDecl), First(reinterpret_cast<uintptr_t>(D)),
@ -725,6 +731,10 @@ public:
Last(DifferentSubobjectTypes? 1 : 0),
Context(&Context) { }
~LookupResult();
LookupResult& operator=(const LookupResult& Other);
LookupKind getKind() const;
/// @brief Determine whether name look found something.

View File

@ -127,6 +127,15 @@ bool Sema::LookupCriteria::isLookupResult(Decl *D) const {
return false;
}
/// @brief Moves the name-lookup results from Other to the
/// newly-constructed LookupResult.
Sema::LookupResult::LookupResult(const LookupResult& Other)
: StoredKind(Other.StoredKind), First(Other.First), Last(Other.Last),
Context(Other.Context) {
Other.StoredKind = Dead;
}
/// @brief Moves the name-lookup results from Other to this LookupResult.
Sema::LookupResult::LookupResult(ASTContext &Context,
IdentifierResolver::iterator F,
IdentifierResolver::iterator L)
@ -167,6 +176,25 @@ Sema::LookupResult::LookupResult(ASTContext &Context,
Last = 0;
}
Sema::LookupResult::~LookupResult() {
if (StoredKind == AmbiguousLookup)
delete getBasePaths();
}
Sema::LookupResult& Sema::LookupResult::operator=(const LookupResult& Other) {
if (StoredKind == AmbiguousLookup)
delete getBasePaths();
StoredKind = Other.StoredKind;
First = Other.First;
Last = Other.Last;
Context = Other.Context;
Other.StoredKind = Dead;
return *this;
}
/// @brief Determine the result of name lookup.
Sema::LookupResult::LookupKind Sema::LookupResult::getKind() const {
switch (StoredKind) {
@ -179,6 +207,10 @@ Sema::LookupResult::LookupKind Sema::LookupResult::getKind() const {
case AmbiguousLookup:
return Last? AmbiguousBaseSubobjectTypes : AmbiguousBaseSubobjects;
case Dead:
assert(false && "Attempt to look at a dead LookupResult");
break;
}
// We can't ever get here.
@ -217,6 +249,9 @@ Decl *Sema::LookupResult::getAsDecl() const {
assert(false &&
"Name lookup returned an ambiguity that could not be handled");
break;
case Dead:
assert(false && "Attempt to look at a dead LookupResult");
}
return 0;