/* { dg-do compile } */
/* { dg-options "-O -finline-functions -finline-small-functions -Wuninitialized" }  */
/* { dg-add-options bind_pic_locally } */

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;
      }
    }

  return false;
}

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);
	}
    }

  return true;
}
