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