Wdeprecated: Make BumpVectorContext movable

Turns out the one place that relied on the implicit copy ctor was safe
because it created an object in a state where the dtor was a no-op, but
that's more luck that good management.

Sure up the API by defining move construction and using it, which
implicitly disallows the unreliable copy operations.

llvm-svn: 244968
This commit is contained in:
David Blaikie 2015-08-13 22:12:21 +00:00
parent 5c73c941c9
commit c1334cc17d
2 changed files with 13 additions and 10 deletions

View File

@ -35,7 +35,12 @@ public:
/// Construct a new BumpVectorContext that creates a new BumpPtrAllocator
/// and destroys it when the BumpVectorContext object is destroyed.
BumpVectorContext() : Alloc(new llvm::BumpPtrAllocator(), 1) {}
BumpVectorContext(BumpVectorContext &&Other) : Alloc(Other.Alloc) {
Other.Alloc.setInt(false);
Other.Alloc.setPointer(nullptr);
}
/// Construct a new BumpVectorContext that reuses an existing
/// BumpPtrAllocator. This BumpPtrAllocator is not destroyed when the
/// BumpVectorContext object is destroyed.

View File

@ -176,8 +176,8 @@ private:
public:
/// Constructs empty scope linked to previous scope in specified place.
LocalScope(BumpVectorContext &ctx, const_iterator P)
: ctx(ctx), Vars(ctx, 4), Prev(P) {}
LocalScope(BumpVectorContext ctx, const_iterator P)
: ctx(std::move(ctx)), Vars(this->ctx, 4), Prev(P) {}
/// Begin of scope in direction of CFG building (backwards).
const_iterator begin() const { return const_iterator(*this, Vars.size()); }
@ -1247,13 +1247,11 @@ void CFGBuilder::addImplicitDtorsForDestructor(const CXXDestructorDecl *DD) {
/// createOrReuseLocalScope - If Scope is NULL create new LocalScope. Either
/// way return valid LocalScope object.
LocalScope* CFGBuilder::createOrReuseLocalScope(LocalScope* Scope) {
if (!Scope) {
llvm::BumpPtrAllocator &alloc = cfg->getAllocator();
Scope = alloc.Allocate<LocalScope>();
BumpVectorContext ctx(alloc);
new (Scope) LocalScope(ctx, ScopePos);
}
return Scope;
if (Scope)
return Scope;
llvm::BumpPtrAllocator &alloc = cfg->getAllocator();
return new (alloc.Allocate<LocalScope>())
LocalScope(BumpVectorContext(alloc), ScopePos);
}
/// addLocalScopeForStmt - Add LocalScope to local scopes tree for statement