diff --git a/lib/IR/Metadata.cpp b/lib/IR/Metadata.cpp index 7a354c42c4c..0f748495261 100644 --- a/lib/IR/Metadata.cpp +++ b/lib/IR/Metadata.cpp @@ -378,14 +378,18 @@ StringRef MDString::getString() const { void *MDNode::operator new(size_t Size, unsigned NumOps) { void *Ptr = ::operator new(Size + NumOps * sizeof(MDOperand)); - MDOperand *First = new (Ptr) MDOperand[NumOps]; - return First + NumOps; + MDOperand *O = static_cast(Ptr); + for (MDOperand *E = O + NumOps; O != E; ++O) + (void)new (O) MDOperand; + return O; } void MDNode::operator delete(void *Mem) { MDNode *N = static_cast(Mem); - MDOperand *Last = static_cast(Mem); - ::operator delete(Last - N->NumOperands); + MDOperand *O = static_cast(Mem); + for (MDOperand *E = O - N->NumOperands; O != E; --O) + (O - 1)->~MDOperand(); + ::operator delete(O); } MDNode::MDNode(LLVMContext &Context, unsigned ID, ArrayRef MDs)