// PR tree-optimization/56029 // { dg-do compile } template struct DefaultDeleter { void operator () (T * ptr) { delete ptr; } }; template struct scoped_ptr_impl { scoped_ptr_impl (T * p):data_ (p) {} template scoped_ptr_impl (scoped_ptr_impl *other):data_ (other->release (), get_deleter ()) {} ~scoped_ptr_impl () { static_cast (data_) (data_.ptr); } void reset (T * p) { data_.ptr = p; } D get_deleter () {} T *release () { data_.ptr = __null; } struct Data : D { Data (T *) : ptr () {} Data (T *, D) : D (), ptr () {} T *ptr; }; Data data_; }; template > struct scoped_ptr { struct RValue { RValue (scoped_ptr * object):object (object) {} scoped_ptr *object; }; scoped_ptr Pass () { return scoped_ptr ((this)); } typedef T element_type; typedef D deleter_type; scoped_ptr () : impl_ (__null) {} scoped_ptr (RValue rvalue) : impl_ (&rvalue.object->impl_) {} void reset (element_type * p) { impl_.reset (p); } scoped_ptr_impl impl_; }; template struct Callback; struct ClientSocketFactory; struct DatagramClientSocket; struct DnsSocketPool { scoped_ptr CreateConnectedSocket (); ClientSocketFactory *socket_factory_; }; int RandInt (int, int); struct BindStateBase {}; struct CallbackBase { CallbackBase (BindStateBase *); ~CallbackBase (); }; template struct BindState; template struct Callback : CallbackBase { template Callback (BindState *bind_state) : CallbackBase (bind_state) {} }; typedef Callback RandIntCallback; struct ClientSocketFactory { virtual DatagramClientSocket *CreateDatagramClientSocket (RandIntCallback) = 0; }; template struct RunnableAdapter; template struct RunnableAdapter { typedef R (RunType) (A1, A2); }; template struct FunctorTraits { typedef RunnableAdapter RunnableType; typedef typename RunnableType::RunType RunType; }; template typename FunctorTraits ::RunnableType MakeRunnable (T) { } template struct Invoker; template struct Invoker <0, StorageType, R (X1, X2)> { typedef R (UnboundRunType) (X1, X2); }; template struct BindState : BindStateBase { typedef Runnable RunnableType; typedef Invoker <0, BindState, RunType> InvokerType; typedef typename InvokerType::UnboundRunType UnboundRunType; BindState (Runnable):runnable_ () {} RunnableType runnable_; }; template Callback ::RunnableType, typename FunctorTraits ::RunType, void ()>::UnboundRunType> Bind (Functor functor) { typedef typename FunctorTraits ::RunnableType RunnableType; typedef typename FunctorTraits ::RunType RunType; typedef BindState BindState; Callback (new BindState (MakeRunnable (functor))); } struct DatagramClientSocket { virtual ~ DatagramClientSocket (); }; scoped_ptr DnsSocketPool::CreateConnectedSocket () { scoped_ptr socket; socket.reset (socket_factory_->CreateDatagramClientSocket (Bind (RandInt))); socket.Pass (); }