1 // PR tree-optimization/56029
2 // { dg-do compile }
3 // { dg-additional-options "-Wno-return-type" }
4 
5 template <class T>
6 struct DefaultDeleter
7 {
operatorDefaultDeleter8   void operator () (T * ptr) { delete ptr; }
9 };
10 template <class T, class D>
11 struct scoped_ptr_impl
12 {
scoped_ptr_implscoped_ptr_impl13   scoped_ptr_impl (T * p):data_ (p) {}
14   template <typename U, typename V>
scoped_ptr_implscoped_ptr_impl15   scoped_ptr_impl (scoped_ptr_impl <U, V> *other):data_ (other->release (), get_deleter ()) {}
~scoped_ptr_implscoped_ptr_impl16   ~scoped_ptr_impl () { static_cast <D> (data_) (data_.ptr); }
resetscoped_ptr_impl17   void reset (T * p) { data_.ptr = p; }
get_deleterscoped_ptr_impl18   D get_deleter () {}
releasescoped_ptr_impl19   T *release () { data_.ptr = __null; }
20   struct Data
21   : D
22   {
Datascoped_ptr_impl::Data23     Data (T *) : ptr () {}
Datascoped_ptr_impl::Data24     Data (T *, D) : D (), ptr () {}
25     T *ptr;
26   };
27   Data data_;
28 };
29 template <class T, class D = DefaultDeleter <T> >
30 struct scoped_ptr
31 {
32   struct RValue
33   {
RValuescoped_ptr::RValue34     RValue (scoped_ptr * object):object (object) {}
35     scoped_ptr *object;
36   };
Passscoped_ptr37   scoped_ptr Pass () { return scoped_ptr ((this)); }
38   typedef T element_type;
39   typedef D deleter_type;
scoped_ptrscoped_ptr40   scoped_ptr () : impl_ (__null) {}
scoped_ptrscoped_ptr41   scoped_ptr (RValue rvalue) : impl_ (&rvalue.object->impl_) {}
resetscoped_ptr42   void reset (element_type * p) { impl_.reset (p); }
43   scoped_ptr_impl <element_type, deleter_type> impl_;
44 };
45 template <typename>
46 struct Callback;
47 struct ClientSocketFactory;
48 struct DatagramClientSocket;
49 struct DnsSocketPool
50 {
51   scoped_ptr <DatagramClientSocket> CreateConnectedSocket ();
52   ClientSocketFactory *socket_factory_;
53 };
54 int RandInt (int, int);
55 struct BindStateBase {};
56 struct CallbackBase
57 {
58   CallbackBase (BindStateBase *);
59   ~CallbackBase ();
60 };
61 template <typename, typename, typename>
62 struct BindState;
63 template <typename R, typename A1, typename A2>
64 struct Callback <R (A1, A2)> : CallbackBase
65 {
66   template <typename Runnable, typename BindRunType, typename BoundArgsType>
67   Callback (BindState <Runnable, BindRunType, BoundArgsType> *bind_state) : CallbackBase (bind_state) {}
68 };
69 typedef Callback <int (int, int)>
70 RandIntCallback;
71 struct ClientSocketFactory
72 {
73   virtual DatagramClientSocket *CreateDatagramClientSocket (RandIntCallback) = 0;
74 };
75 template <typename>
76 struct RunnableAdapter;
77 template <typename R, typename A1, typename A2>
78 struct RunnableAdapter <R (*) (A1, A2)>
79 {
80   typedef R (RunType) (A1, A2);
81 };
82 template <typename T>
83 struct FunctorTraits
84 {
85   typedef RunnableAdapter <T> RunnableType;
86   typedef typename RunnableType::RunType RunType;
87 };
88 template <typename T>
89 typename FunctorTraits <T>::RunnableType MakeRunnable (T)
90 {
91 }
92 template <int, typename, typename>
93 struct Invoker;
94 template <typename StorageType, typename R, typename X1, typename X2>
95 struct Invoker <0, StorageType, R (X1, X2)>
96 {
97   typedef R (UnboundRunType) (X1, X2);
98 };
99 template <typename Runnable, typename RunType>
100 struct BindState <Runnable, RunType, void ()> : BindStateBase
101 {
102   typedef Runnable RunnableType;
103   typedef Invoker <0, BindState, RunType> InvokerType;
104   typedef typename InvokerType::UnboundRunType UnboundRunType;
105   BindState (Runnable):runnable_ () {}
106   RunnableType runnable_;
107 };
108 template <typename Functor>
109 Callback <typename BindState <typename FunctorTraits <Functor>::RunnableType, typename FunctorTraits <Functor>::RunType, void ()>::UnboundRunType>
110 Bind (Functor functor)
111 {
112   typedef typename FunctorTraits <Functor>::RunnableType RunnableType;
113   typedef typename FunctorTraits <Functor>::RunType RunType;
114   typedef BindState <RunnableType, RunType, void ()> BindState;
115   Callback <typename BindState::UnboundRunType> (new BindState (MakeRunnable (functor)));
116 }
117 struct DatagramClientSocket
118 {
119   virtual ~ DatagramClientSocket ();
120 };
121 scoped_ptr <DatagramClientSocket>
122 DnsSocketPool::CreateConnectedSocket ()
123 {
124   scoped_ptr <DatagramClientSocket> socket;
125   socket.reset (socket_factory_->CreateDatagramClientSocket (Bind (RandInt)));
126   socket.Pass ();
127 }
128