diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/pr48484.C')
-rw-r--r-- | gcc/testsuite/g++.dg/pr48484.C | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/pr48484.C b/gcc/testsuite/g++.dg/pr48484.C new file mode 100644 index 0000000..3f17f39 --- /dev/null +++ b/gcc/testsuite/g++.dg/pr48484.C @@ -0,0 +1,105 @@ +/* { dg-do compile } */ +/* { dg-options "-O -finline-functions -finline-small-functions -Wuninitialized" } */ + + +struct SQObjectPtr +{ + int _type; + SQObjectPtr operator = (long); +}; +struct SQObjectPtrVec +{ + SQObjectPtr fff (unsigned); + SQObjectPtr *_vals; +}; + +struct SQInstruction +{ + int _arg1; + unsigned op; + unsigned _arg0; + unsigned _arg2; +}; +struct SQVM +{ + struct CallInfo + { + SQInstruction *_ip; + }; + bool + Execute (SQObjectPtr &, long, long, long, SQObjectPtr &, unsigned, int); + bool + FOREACH_OP + (SQObjectPtr + &, SQObjectPtr &, SQObjectPtr &, SQObjectPtr &, long, int, int &); + SQObjectPtrVec _stack; + CallInfo *ci; + long _nnativecalls; + bool ShouldSuspend (); +}; +struct AutoDec +{ + AutoDec (long *); + ~AutoDec (); +}; +bool + SQVM::FOREACH_OP + (SQObjectPtr + & + o1, + SQObjectPtr & o2, SQObjectPtr &, SQObjectPtr & o4, long, int, int &jump) +{ + long + nrefidx = 0; + switch (o1._type) + { + case 0x02000000: + o4 = nrefidx; + jump = 1; + return true; + case 0x00000080: + { + long + idx = 10; + o2 = idx; + jump = 0; + } + } +} + +bool + SQVM::Execute + (SQObjectPtr &, long, long, long, SQObjectPtr &, unsigned, int) +{ + AutoDec + ad (&_nnativecalls); + for (;;) + { + if (ShouldSuspend ()) + return true; + SQInstruction + _i_ = *ci->_ip; + switch (_i_.op) + { + case 0: + { + int + tojump; + + FOREACH_OP + (_stack._vals + [_i_._arg0], + _stack._vals + [_i_._arg2], + _stack._vals + [_i_._arg2], + _stack._vals[_i_._arg2], _i_._arg2, _i_._arg1, tojump); + + ci += tojump; /* { dg-warning "uninitialized" "warning" } */ + } + case 1: + _stack.fff (_i_._arg1); + } + } + +} |