1 /* { dg-do compile } */
2 /* { dg-options "-O -finline-functions -finline-small-functions -Wuninitialized" }  */
3 /* { dg-add-options bind_pic_locally } */
4 
5 struct SQObjectPtr
6 {
7   int _type;
8   SQObjectPtr operator = (long);
9 };
10 struct SQObjectPtrVec
11 {
12   SQObjectPtr fff (unsigned);
13   SQObjectPtr *_vals;
14 };
15 
16 struct SQInstruction
17 {
18   int _arg1;
19   unsigned op;
20   unsigned _arg0;
21   unsigned _arg2;
22 };
23 struct SQVM
24 {
25   struct CallInfo
26   {
27     SQInstruction *_ip;
28   };
29     bool
30     Execute (SQObjectPtr &, long, long, long, SQObjectPtr &, unsigned, int);
31     bool
32     FOREACH_OP
33     (SQObjectPtr
34      &, SQObjectPtr &, SQObjectPtr &, SQObjectPtr &, long, int, int &);
35   SQObjectPtrVec _stack;
36   CallInfo *ci;
37   long _nnativecalls;
38   bool ShouldSuspend ();
39 };
40 struct AutoDec
41 {
42   AutoDec (long *);
43    ~AutoDec ();
44 };
45 bool
FOREACH_OP(SQObjectPtr & o1,SQObjectPtr & o2,SQObjectPtr &,SQObjectPtr & o4,long,int,int & jump)46   SQVM::FOREACH_OP
47   (SQObjectPtr
48    &
49    o1,
50    SQObjectPtr & o2, SQObjectPtr &, SQObjectPtr & o4, long, int, int &jump)
51 {
52   long
53     nrefidx = 0;
54   switch (o1._type)
55     {
56     case 0x02000000:
57       o4 = nrefidx;
58       jump = 1;
59       return true;
60     case 0x00000080:
61       {
62 	long
63 	  idx = 10;
64 	o2 = idx;
65 	jump = 0;
66       }
67     }
68 
69   return false;
70 }
71 
72 bool
Execute(SQObjectPtr &,long,long,long,SQObjectPtr &,unsigned,int)73   SQVM::Execute
74   (SQObjectPtr &, long, long, long, SQObjectPtr &, unsigned, int)
75 {
76   AutoDec
77   ad (&_nnativecalls);
78   for (;;)
79     {
80       if (ShouldSuspend ())
81 	return true;
82       SQInstruction
83 	_i_ = *ci->_ip;
84       switch (_i_.op)
85 	{
86 	case 0:
87 	  {
88 	    int
89 	      tojump;
90 
91 	    FOREACH_OP
92 	      (_stack._vals
93 	       [_i_._arg0],
94 	       _stack._vals
95 	       [_i_._arg2],
96 	       _stack._vals
97 	       [_i_._arg2],
98 	       _stack._vals[_i_._arg2], _i_._arg2, _i_._arg1, tojump);
99 
100 	    ci += tojump;  /* { dg-warning "uninitialized" "warning" }  */
101 	  }
102 	case 1:
103 	  _stack.fff (_i_._arg1);
104 	}
105     }
106 
107   return true;
108 }
109