forked from OSchip/llvm-project
Re-commit r259942 (reverted in r260053) with a different workaround for the MSVC bug.
This fixes undefined behavior in C++14 due to the size of the object being deleted being different from sizeof(dynamic type) when it is allocated with trailing objects. MSVC seems to have several bugs around using-declarations changing the access of a member inherited from a base class, so use forwarding functions instead of using-declarations to make TrailingObjects::operator delete accessible where desired. llvm-svn: 260180
This commit is contained in:
parent
fed557ef76
commit
1b65c3279d
|
@ -290,9 +290,13 @@ class TrailingObjects : private trailing_objects_internal::TrailingObjectsImpl<
|
|||
}
|
||||
|
||||
public:
|
||||
// make this (privately inherited) class public.
|
||||
// Make this (privately inherited) member public.
|
||||
using ParentType::OverloadToken;
|
||||
|
||||
/// Disable sized deallocation for all objects with trailing object storage;
|
||||
/// the inferred size will typically not be correct.
|
||||
void operator delete(void *P) { return ::operator delete(P); }
|
||||
|
||||
/// Returns a pointer to the trailing object array of the given type
|
||||
/// (which must be one of those specified in the class template). The
|
||||
/// array may have zero or more elements in it.
|
||||
|
|
|
@ -171,6 +171,8 @@ class AttributeSetNode final
|
|||
void operator=(const AttributeSetNode &) = delete;
|
||||
AttributeSetNode(const AttributeSetNode &) = delete;
|
||||
public:
|
||||
void operator delete(void *p) { TrailingObjects::operator delete(p); }
|
||||
|
||||
static AttributeSetNode *get(LLVMContext &C, ArrayRef<Attribute> Attrs);
|
||||
|
||||
bool hasAttribute(Attribute::AttrKind Kind) const {
|
||||
|
@ -266,6 +268,8 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void operator delete(void *p) { TrailingObjects::operator delete(p); }
|
||||
|
||||
/// \brief Get the context that created this AttributeSetImpl.
|
||||
LLVMContext &getContext() { return Context; }
|
||||
|
||||
|
|
|
@ -34,6 +34,7 @@ public:
|
|||
void *Mem = ::operator new(totalSizeToAlloc<short>(NumShorts));
|
||||
return new (Mem) Class1(ShortArray, NumShorts);
|
||||
}
|
||||
void operator delete(void *p) { TrailingObjects::operator delete(p); }
|
||||
|
||||
short get(unsigned Num) const { return getTrailingObjects<short>()[Num]; }
|
||||
|
||||
|
@ -78,6 +79,7 @@ public:
|
|||
*C->getTrailingObjects<double>() = D;
|
||||
return C;
|
||||
}
|
||||
void operator delete(void *p) { TrailingObjects::operator delete(p); }
|
||||
|
||||
short getShort() const {
|
||||
if (!HasShort)
|
||||
|
|
Loading…
Reference in New Issue