// { dg-lto-do link }
// { dg-require-effective-target lto_incremental }
// { dg-lto-options { { -flto -std=c++11 -g2 -fno-lto-odr-type-merging -O2 -Wno-return-type } } }
// { dg-extra-ld-options "-r -nostdlib -O2 -fno-lto-odr-type-merging" }

namespace std
{
  typedef long unsigned int size_t;
}
extern "C"
{
  typedef struct
  {
  } __mbstate_t;
}
namespace std __attribute__ ((__visibility__ ("default")))
{
  template < class _CharT > struct char_traits;
}

typedef __mbstate_t mbstate_t;
namespace std __attribute__ ((__visibility__ ("default")))
{
  template < typename _CharT, typename _Traits =
    char_traits < _CharT > >class basic_ostream;
  typedef basic_ostream < char >ostream;
}

using namespace std;
class Cstring
{
public:
  Cstring (const char *str, int l = 0);
};
extern ostream & operator << (ostream & os, const Cstring & string);
class Foo_Log_Handler
{
  virtual int write_message (const char *msg, size_t msg_len, int channel,
			     int level) = 0;
};
class Foo_Log_Handler_Stream:public Foo_Log_Handler
{
  virtual int write_message (const char *msg, size_t msg_len, int channel,
			     int level) override;
  Cstring m_filename;
};
namespace std __attribute__ ((__visibility__ ("default")))
{
  template <> struct char_traits <char >
  {
    typedef mbstate_t state_type;
  };
  enum _Ios_Fmtflags
  {
  };
  enum _Ios_Iostate
  {
  };
  class ios_base
  {
  public:
    typedef _Ios_Iostate iostate;
  };
}

namespace std __attribute__ ((__visibility__ ("default")))
{
  template < typename _CharT > class __ctype_abstract_base
  {
  };
  template < typename _CharT > class ctype
  {
  public:
    typedef char char_type;
    mutable char _M_widen_ok;
    char_type widen (char __c) const
    {
      if (_M_widen_ok)
	return this->do_widen (__c);
    }
    virtual char_type do_widen (char __c) const
    {
    }
  };
  template < typename _Facet >
    inline const _Facet & __check_facet (const _Facet * __f)
  {
  }
template < typename _CharT, typename _Traits > class basic_ios:public
    ios_base
  {
    typedef _CharT char_type;
    typedef ctype < _CharT > __ctype_type;
    const __ctype_type *_M_ctype;
  public:
    iostate rdstate ()const
    {
    }
    bool good () const
    {
    }
    char_type widen (char __c) const
    {
      return __check_facet (_M_ctype).widen (__c);
    }
  };
template < typename _CharT, typename _Traits > class basic_ostream:virtual public basic_ios < _CharT,
    _Traits
    >
  {
  public:
    typedef _CharT char_type;
    typedef _Traits traits_type;
    typedef basic_ostream < _CharT, _Traits > __ostream_type;
    __ostream_type & operator<< (__ostream_type & (*__pf) (__ostream_type &))
    {
      return __pf (*this);
    }
    __ostream_type & put (char_type __c);
  };
  template < typename _CharT,
    typename _Traits > inline basic_ostream < _CharT,
    _Traits > &endl (basic_ostream < _CharT, _Traits > &__os)
  {
    return flush (__os.put (__os.widen ('\n')));
  }
  template < typename _CharT,
    typename _Traits > inline basic_ostream < _CharT,
    _Traits > &flush (basic_ostream < _CharT, _Traits > &__os)
  {
  }
  extern ostream cerr;
}

int
Foo_Log_Handler_Stream::write_message (const char *msg, size_t msg_len, int,
					 int level)
{
  {
    {
      cerr << "FATAL: cannot write into log file: " << m_filename << endl;
    }
  }
}
