/* { dg-do compile } */
/* { dg-options "-O2" } */
/* Test check use_block_copy bit propagation in sra element hierarchy.  */

typedef unsigned char UINT8 ;
typedef unsigned int UINT ;
class C4
{
public:
  int xy[2];
};

class C3
{
public:
  inline void
  Reset()
  {
    C4 const mvMax = {0x7fff, 0x7fff};

    m42(0,mvMax); 
    m42(1,mvMax);
    m43(0);
  };

  inline void m42 (UINT  i, C4 mv)
  {
    mMv[i] = mv;
  };



  inline void  m43(UINT j)
  {
    m44 (j);
    d41 = j + 1;
  };

private:

  C4 mMv[2];
  UINT8 d41;
  inline void m44 (UINT j) const {};
};

class C2
{
private:
  bool valid;
};

class C1
{
public:
  void m1(C3 *c);

private:
  const C2 * d1[2];
  void m2(C3 *m);
};                                                                                                                                                                           

void C1::m1 (C3 *r)
{
  C3 x;
  m2(&x);
}
void C1::m2(C3 *x)
{
  C3 m3;
  int i;
  m3.Reset ();
  for(i=0; i<2; i++)
    {
      const C2 * r = d1[i];
      if (r!=__null)
        {
	  C4 const c400 = {0,0};
          m3.m42 (i, c400);
	  
        }
    }
}   

