diff options
Diffstat (limited to 'contrib/llvm-project/clang/lib/AST/Interp/InterpBlock.cpp')
-rw-r--r-- | contrib/llvm-project/clang/lib/AST/Interp/InterpBlock.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/contrib/llvm-project/clang/lib/AST/Interp/InterpBlock.cpp b/contrib/llvm-project/clang/lib/AST/Interp/InterpBlock.cpp index a62128d9cfae..5ac778aeb607 100644 --- a/contrib/llvm-project/clang/lib/AST/Interp/InterpBlock.cpp +++ b/contrib/llvm-project/clang/lib/AST/Interp/InterpBlock.cpp @@ -73,7 +73,7 @@ void Block::replacePointer(Pointer *Old, Pointer *New) { removePointer(Old); addPointer(New); - Old->Pointee = nullptr; + Old->PointeeStorage.BS.Pointee = nullptr; #ifndef NDEBUG assert(!hasPointer(Old)); @@ -92,7 +92,8 @@ bool Block::hasPointer(const Pointer *P) const { #endif DeadBlock::DeadBlock(DeadBlock *&Root, Block *Blk) - : Root(Root), B(Blk->Desc, Blk->IsStatic, Blk->IsExtern, /*isDead=*/true) { + : Root(Root), + B(~0u, Blk->Desc, Blk->IsStatic, Blk->IsExtern, /*isDead=*/true) { // Add the block to the chain of dead blocks. if (Root) Root->Prev = this; @@ -104,10 +105,14 @@ DeadBlock::DeadBlock(DeadBlock *&Root, Block *Blk) // Transfer pointers. B.Pointers = Blk->Pointers; for (Pointer *P = Blk->Pointers; P; P = P->Next) - P->Pointee = &B; + P->PointeeStorage.BS.Pointee = &B; + Blk->Pointers = nullptr; } void DeadBlock::free() { + if (B.IsInitialized) + B.invokeDtor(); + if (Prev) Prev->Next = Next; if (Next) |