// { dg-do compile }
// { dg-options "-finline-small-functions -findirect-inlining -finline-functions -O" }
typedef struct
{} __mpf_struct;
typedef __mpf_struct mpf_t[1];
typedef const __mpf_struct *mpf_srcptr;
typedef __mpf_struct *mpf_ptr;
extern "C" {
 void __gmpf_add (mpf_ptr, mpf_srcptr, mpf_srcptr);
}
class _knumber
{
 public:
  enum NumType {SpecialType, IntegerType, FractionType, FloatType};
  virtual NumType type(void) const = 0;
  virtual _knumber * add(_knumber const & arg2) const = 0;
  virtual operator long int(void) const = 0;
};
class _knumfloat : public _knumber
{
  _knumfloat(double num = 1.0)
  ;
  virtual NumType type(void) const ;
  virtual _knumber * add(_knumber const & arg2) const;
  virtual operator long int (void) const;
    mpf_t _mpf;
};
_knumber *_knumfloat::add(_knumber const & arg2) const
{
  if (arg2.type() == SpecialType)
    return arg2.add(*this);
{
    _knumfloat tmp_num(arg2);
    return tmp_num.add(*this);
  }
  _knumfloat * tmp_num = new _knumfloat();
  __gmpf_add(tmp_num->_mpf, _mpf,
   dynamic_cast<_knumfloat const &>(arg2)._mpf);
}
