global statement removal: hphp/test [7/x]
[hiphop-php.git] / hphp / test / quick / hh_closure_return_type_this_3.php
blob57171c6df05988668e61dc77115992d24c2f8f57
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 function ($p) { return $p; }; }
25 function f2() { return function ($p): int { return $p; }; }
26 function f2_soft() { return function ($p): @int { return $p; }; }
27 function f3() { return function ($p): string { return $p; }; }
28 function f3_soft() { return function ($p): @string { return $p; }; }
29 function f4() { return function ($p): bool { return $p; }; }
30 function f4_soft() { return function ($p): @bool { return $p; }; }
31 function f5() { return function ($p): float { return $p; }; }
32 function f5_soft() { return function ($p): @float { return $p; }; }
33 function f6() { return function ($p): resource { return $p; }; }
34 function f6_soft() { return function ($p): @resource { return $p; }; }
35 function f7() { return function ($p): array { return $p; }; }
36 function f7_soft() { return function ($p): @array { return $p; }; }
37 function f8() { return function ($p): callable { return $p; }; }
38 function f8_soft() { return function ($p): @callable { return $p; }; }
39 function f9() { return function ($p): Figure { return $p; }; }
40 function f9_soft() { return function ($p): @Figure { return $p; }; }
41 function f10() { return function ($p): Square { return $p; }; }
42 function f10_soft() { return function ($p): @Square { return $p; }; }
43 function f11() { return function ($p): :div { return $p; }; }
44 function f11_soft() { return function ($p): @:div { return $p; }; }
45 function f12() { return function ($p): Fractal<Square> { return $p; }; }
46 function f12_soft() { return function ($p): @Fractal<Square> { return $p; }; }
47 function f13<T>() { return function ($p): Fractal<T> { return $p; }; }
48 function f13_soft<T>() { return function ($p): @Fractal<T> { return $p; }; }
49 function f14() { return function ($p): my_t { return $p; }; }
50 function f14_soft() { return function ($p): @my_t { return $p; }; }
51 function f15() { return function ($p): void { return $p; }; }
52 function f15_soft() { return function ($p): @void { return $p; }; }
53 function f16() { return function ($p): mixed { return $p; }; }
54 function f16_soft() { return function ($p): @mixed { return $p; }; }
55 function f17() { return function ($p): ?int { return $p; }; }
56 function f17_soft() { return function ($p): @?int { return $p; }; }
57 function f18() { return function ($p): (string, int) { return $p; }; }
58 function f18_soft() { return function ($p): @(string, int) { return $p; }; }
59 function f19() { return function ($p): (function(int): int) { return $p; }; }
60 function f19_soft() {
61 return function ($p): @(function(int): int) { return $p; };
63 function f20() { return function ($p): callable { return $p; }; }
64 function f20_soft() { return function ($p): @callable { return $p; }; }
66 class Figure {}
67 class Square extends Figure {}
68 class Fractal<T> extends Figure {}
69 class :div {}
71 class A {}
72 class B extends A {
73 public function f21() { return function (): this { return $this; }; }
74 public function f21_soft() { return function (): @this { return $this; }; }
75 public function f22() { return function ($p): this { return $p; }; }
76 public function f22_soft() { return function ($p): @this { return $p; }; }
77 public static function f23() { return function ($p): self { return $p; }; }
78 public static function f23_soft() {
79 return function ($p): @self { return $p; };
81 public static function f24() { return function ($p): parent { return $p; }; }
82 public static function f24_soft() {
83 return function ($p): @parent { return $p; };
85 public static function testfunc() {}
87 class C extends B {}
89 function testfunc() {}
91 function call_wrapper($fn, $arg) {
92 try {
93 $fn($arg);
94 } catch (Exception $e) {
95 echo "Caught exception: " . $e->getMessage() . "\n";
99 function main() {
100 for ($i = 1; $i <= 20; $i++) {
101 foreach (array('', '_soft') as $suffix) {
102 if ($suffix !== '' && $i === 1) {
103 // f1_soft() does not exist
104 continue;
106 $f = 'f' . $i . $suffix;
107 echo "\ncalling $f\n";
108 call_wrapper($f(), null);
109 call_wrapper($f(), 42);
110 call_wrapper($f(), 'foobar');
111 call_wrapper($f(), true);
112 call_wrapper($f(), 14.1);
113 call_wrapper($f(), imagecreate(10, 10));
114 call_wrapper($f(), array());
115 call_wrapper($f(), function($x){return $x*$x;});
116 call_wrapper($f(), new Figure());
117 call_wrapper($f(), new Square());
118 call_wrapper($f(), new Fractal());
119 call_wrapper($f(), <div/>);
120 call_wrapper($f(), 'testfunc');
121 call_wrapper($f(), array('C', 'testfunc'));
125 $c = new C();
126 echo "\ncalling f21\n";
127 try {
128 $f = $c->f21();
129 $f();
130 } catch (Exception $e) {
131 echo "Caught exception: " . $e->getMessage() . "\n";
133 try {
134 $f = $c->f21_soft();
135 $f();
136 } catch (Exception $e) {
137 echo "Caught exception: " . $e->getMessage() . "\n";
140 $callbacks = Map {
141 'f22' => array($c, 'f22'),
142 'f22_soft' => array($c, 'f22_soft'),
143 'f23' => array('C', 'f23'),
144 'f23_soft' => array('C', 'f23_soft'),
145 'f24' => array('C', 'f24'),
146 'f24_soft' => array('C', 'f24_soft')
148 foreach ($callbacks as $name => $f) {
149 echo "\ncalling $name\n";
150 call_wrapper($f(), null);
151 call_wrapper($f(), 42);
152 call_wrapper($f(), 'foobar');
153 call_wrapper($f(), true);
154 call_wrapper($f(), 14.1);
155 call_wrapper($f(), imagecreate(10, 10));
156 call_wrapper($f(), array());
157 call_wrapper($f(), function($x){return $x*$x;});
158 call_wrapper($f(), new Figure());
159 call_wrapper($f(), new Square());
160 call_wrapper($f(), new Fractal());
161 call_wrapper($f(), <div/>);
162 call_wrapper($f(), new A());
163 call_wrapper($f(), new B());
164 call_wrapper($f(), new C());
166 echo "Done\n";
168 main();