global statement removal: hphp/test [7/x]
[hiphop-php.git] / hphp / test / quick / hh_async_closure_return_type_1.php
blobfbe83ec3fc12fa4c0798d8f5185ea348964b780f
1 <?hh
4 error_reporting(-1);
5 function handler($errno, $errmsg) {
6 $pos = strpos($errmsg, ", Closure");
7 if ($pos !== false) {
8 $errmsg = substr($errmsg, 0, $pos) . ", Closure given";
10 if ($errno === E_RECOVERABLE_ERROR) {
11 throw new Exception($errmsg);
12 } else if ($errno === E_WARNING) {
13 echo "Triggered E_WARNING: $errmsg\n";
14 } else if ($errno === E_NOTICE) {
15 echo "Triggered E_NOTICE: $errmsg\n";
16 } else {
17 return false;
20 set_error_handler('handler');
22 type my_t = int;
24 function f1() { return async function ($p) { return $p; }; }
25 function f2() { return async function ($p): Awaitable<int> { return $p; }; }
26 function f2_soft() {
27 return async function ($p): @Awaitable<int> { return $p; };
29 function f3() { return async function ($p): Awaitable<string> { return $p; }; }
30 function f3_soft() {
31 return async function ($p): @Awaitable<string> { return $p; };
33 function f4() { return async function ($p): Awaitable<bool> { return $p; }; }
34 function f4_soft() {
35 return async function ($p): @Awaitable<bool> { return $p; };
37 function f5() { return async function ($p): Awaitable<float> { return $p; }; }
38 function f5_soft() {
39 return async function ($p): @Awaitable<float> { return $p; };
41 function f6() {
42 return async function ($p): Awaitable<resource> { return $p; };
44 function f6_soft() {
45 return async function ($p): @Awaitable<resource> { return $p; };
47 function f7() {
48 return async function ($p): Awaitable<array> { return $p; };
50 function f7_soft() {
51 return async function ($p): @Awaitable<array> { return $p; };
53 function f8() {
54 return async function ($p): Awaitable<callable> { return $p; };
56 function f8_soft() {
57 return async function ($p): @Awaitable<callable> { return $p; };
59 function f9() { return async function ($p): Awaitable<Figure> { return $p; }; }
60 function f9_soft() {
61 return async function ($p): @Awaitable<Figure> { return $p; };
63 function f10() { return async function ($p): Awaitable<Square> { return $p; }; }
64 function f10_soft() {
65 return async function ($p): @Awaitable<Square> { return $p; };
67 function f11() { return async function ($p): Awaitable<:div> { return $p; }; }
68 function f11_soft() {
69 return async function ($p): @Awaitable<:div> { return $p; };
71 function f12() {
72 return async function ($p): Awaitable<Fractal<Square>> { return $p; };
74 function f12_soft() {
75 return async function ($p): @Awaitable<Fractal<Square>> { return $p; };
77 function f13<T>() {
78 return async function ($p): Awaitable<Fractal<T>> { return $p; };
80 function f13_soft<T>() {
81 return async function ($p): @Awaitable<Fractal<T>> { return $p; };
83 function f14() { return async function ($p): Awaitable<my_t> { return $p; }; }
84 function f14_soft() {
85 return async function ($p): @Awaitable<my_t> { return $p; };
87 function f15() { return async function ($p): Awaitable<void> { return $p; }; }
88 function f15_soft() {
89 return async function ($p): @Awaitable<void> { return $p; };
91 function f16() { return async function ($p): Awaitable<mixed> { return $p; }; }
92 function f16_soft() {
93 return async function ($p): @Awaitable<mixed> { return $p; };
95 function f17() { return async function ($p): Awaitable<?int> { return $p; }; }
96 function f17_soft() {
97 return async function ($p): @Awaitable<?int> { return $p; };
99 function f18() {
100 return async function ($p): Awaitable<(string, int)> { return $p; };
102 function f18_soft() {
103 return async function ($p): @Awaitable<(string, int)> { return $p; };
105 function f19() {
106 return async function ($p): Awaitable<(function(int): int)> { return $p; };
108 function f19_soft() {
109 return async function ($p): @Awaitable<(function(int): int)> { return $p; };
111 function f20() {
112 return async function ($p): Awaitable<callable> { return $p; };
114 function f20_soft() {
115 return async function ($p): @Awaitable<callable> { return $p; };
118 class Figure {}
119 class Square extends Figure {}
120 class Fractal<T> extends Figure {}
121 class :div {}
123 class A {}
124 class B extends A {
125 public function f21() {
126 return async function (): Awaitable<this> { return $this; };
128 public function f21_soft() {
129 return async function (): @Awaitable<this> { return $this; };
131 public function f22() {
132 return async function ($p): Awaitable<this> { return $p; };
134 public function f22_soft() {
135 return async function ($p): @Awaitable<this> { return $p; };
137 public static function f23() {
138 return async function ($p): Awaitable<self> { return $p; };
140 public static function f23_soft() {
141 return async function ($p): @Awaitable<self> { return $p; };
143 public static function f24() {
144 return async function ($p): Awaitable<parent> { return $p; };
146 public static function f24_soft() {
147 return async function ($p): @Awaitable<parent> { return $p; };
149 public static function testfunc() {}
151 class C extends B {}
153 function testfunc() {}
155 function call_wrapper($fn, $arg) {
156 try {
157 HH\Asio\join($fn($arg));
158 } catch (Exception $e) {
159 echo "Caught exception: " . $e->getMessage() . "\n";
163 function main() {
164 for ($i = 1; $i <= 20; $i++) {
165 foreach (array('', '_soft') as $suffix) {
166 if ($suffix !== '' && $i === 1) {
167 // f1_soft() does not exist
168 continue;
170 $f = 'f' . $i . $suffix;
171 echo "\ncalling $f\n";
172 call_wrapper($f(), null);
173 call_wrapper($f(), 42);
174 call_wrapper($f(), 'foobar');
175 call_wrapper($f(), true);
176 call_wrapper($f(), 14.1);
177 call_wrapper($f(), imagecreate(10, 10));
178 call_wrapper($f(), array());
179 call_wrapper($f(), function($x){return $x*$x;});
180 call_wrapper($f(), new Figure());
181 call_wrapper($f(), new Square());
182 call_wrapper($f(), new Fractal());
183 call_wrapper($f(), <div/>);
184 call_wrapper($f(), 'testfunc');
185 call_wrapper($f(), array('C', 'testfunc'));
189 $c = new C();
190 echo "\ncalling f21\n";
191 try {
192 $f = $c->f21();
193 HH\Asio\join($f());
194 } catch (Exception $e) {
195 echo "Caught exception: " . $e->getMessage() . "\n";
197 try {
198 $f = $c->f21_soft();
199 HH\Asio\join($f());
200 } catch (Exception $e) {
201 echo "Caught exception: " . $e->getMessage() . "\n";
204 $callbacks = Map {
205 'f22' => array($c, 'f22'),
206 'f22_soft' => array($c, 'f22_soft'),
207 'f23' => array('C', 'f23'),
208 'f23_soft' => array('C', 'f23_soft'),
209 'f24' => array('C', 'f24'),
210 'f24_soft' => array('C', 'f24_soft')
212 foreach ($callbacks as $name => $f) {
213 echo "\ncalling $name\n";
214 call_wrapper($f(), null);
215 call_wrapper($f(), 42);
216 call_wrapper($f(), 'foobar');
217 call_wrapper($f(), true);
218 call_wrapper($f(), 14.1);
219 call_wrapper($f(), imagecreate(10, 10));
220 call_wrapper($f(), array());
221 call_wrapper($f(), function($x){return $x*$x;});
222 call_wrapper($f(), new Figure());
223 call_wrapper($f(), new Square());
224 call_wrapper($f(), new Fractal());
225 call_wrapper($f(), <div/>);
226 call_wrapper($f(), new A());
227 call_wrapper($f(), new B());
228 call_wrapper($f(), new C());
230 echo "Done\n";
232 main();