// PR target/34403
// Origin: Martin Michlmayr <tbm@cyrius.com>

// { dg-do compile }
// { dg-options "-O" }

typedef unsigned char uint8_t;
typedef uint8_t uint8;
__extension__ typedef __SIZE_TYPE__ size_t;
class csVector2
{
public:float x;
};
class csBox2
{
};
struct iBase
{
};
struct iClipper2D:public virtual iBase
{
};
template < class Class > class scfImplementation:public virtual iBase
{
};
template < class Class, class I1 > class scfImplementation1:public
scfImplementation < Class >,
  public I1
{
};
class csClipper:public scfImplementation1 < csClipper, iClipper2D >
{
};
class csBoxClipper:public csClipper
{
  csBox2 region;
  virtual uint8 Clip (csVector2 * InPolygon, size_t InCount,
                      csVector2 * OutPolygon, size_t & OutCount);
};
struct StatusOutputNone
{
};
namespace CS
{
  template < typename BoxTest, typename StatusOutput > class BoxClipper
  {
    BoxTest boxTest;
    StatusOutput statOut;
    const csBox2 & region;
    csVector2 *InP;
    size_t InV;
    csVector2 *OutP;
    size_t OutV;
  public:  BoxClipper (const BoxTest & boxTest, const StatusOutput & statOut,
                  const csBox2 & region, csVector2 * InP, size_t InV,
                  csVector2 * OutP):boxTest (boxTest), statOut (statOut),
      region (region), InP (InP), InV (InV), OutP (OutP), OutV (-1)
    {
    }
    uint8 Clip ()
    {
      // OutV is initialized to SIZE_MAX in the ctor above causing
      // the multiplication below to produce a very large number
      // in excess of the maximum possible object size (SIZE_MAX/2).
      __builtin_memcpy (this->OutP, InP, OutV * sizeof (csVector2));   // { dg-warning "exceeds maximum object size" }
      return 0;
    }
  };
}
struct BoxTestAll
{
};
uint8
csBoxClipper::Clip (csVector2 * InPolygon, size_t InCount,
                    csVector2 * OutPolygon, size_t & OutCount)
{
  BoxTestAll b;
  StatusOutputNone n;
  CS::BoxClipper < BoxTestAll, StatusOutputNone > boxClip (b, n, region,
                                                           InPolygon, InCount,
                                                           OutPolygon);
  uint8 Clipped = boxClip.Clip ();
  return 0;
}
