// { dg-do compile } namespace std { typedef __SIZE_TYPE__ size_t; } inline void* operator new(std::size_t, void* __p) throw() { return __p; } class Noncopyable { }; struct CollectorCell { }; template class PassRefPtr { public: T* releaseRef() const { } }; template class NonNullPassRefPtr { public: template NonNullPassRefPtr(const PassRefPtr& o) : m_ptr(o.releaseRef()) { } mutable T* m_ptr; }; struct ClassInfo; class JSValue { }; JSValue jsNull(); class Structure; class JSGlobalData { static void storeVPtrs(); }; class JSCell : public Noncopyable { friend class JSObject; friend class JSGlobalData; virtual ~JSCell(); }; class JSObject : public JSCell { public: explicit JSObject(NonNullPassRefPtr); static PassRefPtr createStructure(JSValue prototype) { } }; class JSByteArray : public JSObject { friend class JSGlobalData; enum VPtrStealingHackType { VPtrStealingHack }; JSByteArray(VPtrStealingHackType) : JSObject(createStructure(jsNull())), m_classInfo(0) { } const ClassInfo* m_classInfo; }; void JSGlobalData::storeVPtrs() { CollectorCell cell; void* storage = &cell; JSCell* jsByteArray = new (storage) JSByteArray(JSByteArray::VPtrStealingHack); jsByteArray->~JSCell(); }