PR c++/80290
[official-gcc.git] / gcc / testsuite / g++.dg / opt / new1.C
blob22bd5c3920a21b05452f8841b3a742598eb27f7c
1 // PR c++/39367 - ICE at tree-inline.c:1042 with -O
2 // { dg-options "-O" }
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;
14 namespace QScript {
15     namespace Ecma {
16         class Core {
17         public:
18             inline QScriptEnginePrivate *engine() const     { return 0; }
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     };
35 template <typename T> void QScript::Buffer<T>::resize(int s) {
36     if (m_capacity < s)
37       reserve (s << 1);
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];
49 class QScriptObject {
50 public:
51     inline void reset();
52     QScript::Buffer<QScriptValueImpl> m_values;
54 class QScriptEnginePrivate {
55 public:
56   inline QScriptObject *allocObject() { return 0; }
57     inline void newObject(QScriptValueImpl *o, const QScriptValueImpl &proto,
58                           QScriptClassInfo *oc = 0);
60 inline void QScriptEnginePrivate::newObject(QScriptValueImpl *o,
61                                             const QScriptValueImpl &proto,
62                                             QScriptClassInfo *oc)
64   QScriptObject *od = allocObject();
65   od->reset();
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     }
78 // { dg-prune-output "\\\[-Walloc-size-larger-than=]" }