From 41c8ba80de74c45e5ca0987c0f36a27f6e02bb43 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Thu, 15 Jan 2009 02:19:31 +0000 Subject: [PATCH] Deallocate the BasePaths structure that we allocate for LookupResult. llvm-svn: 62250 --- clang/lib/Sema/Sema.h | 14 ++++++++++++-- clang/lib/Sema/SemaLookup.cpp | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index eb718f7f1ad1..cf9f8502c722 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -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(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. diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index b85824382bf4..cc9a36ced223 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -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;