131
|
1 // PR c++/39367 - ICE at tree-inline.c:1042 with -O
|
111
|
2 // { dg-options "-O" }
|
|
3
|
|
4 class QScriptEnginePrivate;
|
|
5 class QScriptClassInfo;
|
|
6 namespace QScript {
|
|
7 enum Type { InvalidType };
|
|
8 };
|
|
9 class QScriptValueImpl {
|
|
10 public:
|
|
11 inline QScriptValueImpl();
|
|
12 QScript::Type m_type;
|
|
13 };
|
|
14 namespace QScript {
|
|
15 namespace Ecma {
|
|
16 class Core {
|
|
17 public:
|
131
|
18 inline QScriptEnginePrivate *engine() const { return 0; }
|
|
19 inline QScriptClassInfo *classInfo() const { return 0; }
|
111
|
20 QScriptValueImpl publicPrototype;
|
|
21 };
|
|
22 class Boolean: public Core {
|
|
23 void newBoolean(QScriptValueImpl *result, bool value = false);
|
|
24 };
|
|
25 }
|
|
26 template <typename T> class Buffer {
|
|
27 public:
|
|
28 inline void reserve(int num);
|
|
29 inline void resize(int s);
|
|
30 T *m_data;
|
|
31 int m_capacity;
|
|
32 int m_size;
|
|
33 };
|
|
34 }
|
|
35 template <typename T> void QScript::Buffer<T>::resize(int s) {
|
|
36 if (m_capacity < s)
|
|
37 reserve (s << 1);
|
|
38 }
|
|
39 template <typename T> void QScript::Buffer<T>::reserve(int x) {
|
131
|
40 /* The following may be optimized into a trap because the function
|
|
41 is called from resize(0) and so with m_capacity < 0. When not
|
|
42 optimized it may trigger -Walloc-size-larger-than= since
|
|
43 operator new() is called with an excessively large value.
|
|
44 The warning is pruned from the test output below. */
|
111
|
45 T *new_data = new T[m_capacity];
|
|
46 for (int i=0; i<m_size; ++i)
|
|
47 new_data[i] = m_data[i];
|
|
48 }
|
|
49 class QScriptObject {
|
|
50 public:
|
|
51 inline void reset();
|
|
52 QScript::Buffer<QScriptValueImpl> m_values;
|
|
53 };
|
|
54 class QScriptEnginePrivate {
|
|
55 public:
|
|
56 inline QScriptObject *allocObject() { return 0; }
|
|
57 inline void newObject(QScriptValueImpl *o, const QScriptValueImpl &proto,
|
|
58 QScriptClassInfo *oc = 0);
|
|
59 };
|
|
60 inline void QScriptEnginePrivate::newObject(QScriptValueImpl *o,
|
|
61 const QScriptValueImpl &proto,
|
|
62 QScriptClassInfo *oc)
|
|
63 {
|
|
64 QScriptObject *od = allocObject();
|
|
65 od->reset();
|
|
66 }
|
|
67 inline QScriptValueImpl::QScriptValueImpl() : m_type(QScript::InvalidType) { }
|
|
68 inline void QScriptObject::reset() { m_values.resize(0); }
|
|
69 namespace QScript {
|
|
70 namespace Ecma {
|
|
71 void Boolean::newBoolean(QScriptValueImpl *result, bool value)
|
|
72 {
|
|
73 engine()->newObject(result, publicPrototype, classInfo());
|
|
74 }
|
|
75 }
|
|
76 }
|
131
|
77
|
|
78 // { dg-prune-output "\\\[-Walloc-size-larger-than=]" }
|