5 function handler($errno, $errmsg) {
6 $pos = strpos($errmsg, ", Closure");
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";
20 set_error_handler('handler');
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; }; }
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; }; }
67 class Square
extends Figure
{}
68 class Fractal
<T
> extends Figure
{}
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() {}
89 function testfunc() {}
91 function call_wrapper($fn, $arg) {
94 } catch (Exception
$e) {
95 echo "Caught exception: " . $e->getMessage() . "\n";
100 for ($i = 1; $i <= 20; $i++
) {
101 foreach (array('', '_soft') as $suffix) {
102 if ($suffix !== '' && $i === 1) {
103 // f1_soft() does not exist
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'));
126 echo "\ncalling f21\n";
130 } catch (Exception
$e) {
131 echo "Caught exception: " . $e->getMessage() . "\n";
136 } catch (Exception
$e) {
137 echo "Caught exception: " . $e->getMessage() . "\n";
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());