summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/torture/pr45580.C
blob: c3af4910aeba7e752c58db91842f9bb876da8616 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
// { 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<typename T> class PassRefPtr {
public:
    T* releaseRef() const { }
};
template <typename T> class NonNullPassRefPtr {
public:
    template <class U> NonNullPassRefPtr(const PassRefPtr<U>& 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<Structure>);
    static PassRefPtr<Structure> 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();
}