1 // PR c++/39367 - ICE at tree-inline.c:1042 with -O
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:
engine()18 inline QScriptEnginePrivate *engine() const { return 0; }
classInfo()19 inline QScriptClassInfo *classInfo() const { return 0; }
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 }
resize(int s)35 template <typename T> void QScript::Buffer<T>::resize(int s) {
36 if (m_capacity < s)
37 reserve (s << 1);
38 }
reserve(int x)39 template <typename T> void QScript::Buffer<T>::reserve(int x) {
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. */
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:
allocObject()56 inline QScriptObject *allocObject() { return 0; }
57 inline void newObject(QScriptValueImpl *o, const QScriptValueImpl &proto,
58 QScriptClassInfo *oc = 0);
59 };
newObject(QScriptValueImpl * o,const QScriptValueImpl & proto,QScriptClassInfo * oc)60 inline void QScriptEnginePrivate::newObject(QScriptValueImpl *o,
61 const QScriptValueImpl &proto,
62 QScriptClassInfo *oc)
63 {
64 QScriptObject *od = allocObject();
65 od->reset();
66 }
QScriptValueImpl()67 inline QScriptValueImpl::QScriptValueImpl() : m_type(QScript::InvalidType) { }
reset()68 inline void QScriptObject::reset() { m_values.resize(0); }
69 namespace QScript {
70 namespace Ecma {
newBoolean(QScriptValueImpl * result,bool value)71 void Boolean::newBoolean(QScriptValueImpl *result, bool value)
72 {
73 engine()->newObject(result, publicPrototype, classInfo());
74 }
75 }
76 }
77
78 // { dg-prune-output "\\\[-Walloc-size-larger-than=]" }
79