2 // Copyright 2004-present Facebook. All Rights Reserved.
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($p) { return $p; }
25 function f2($p): int { return $p; }
26 function f2_soft($p): @int
{ return $p; }
27 function f3($p): string { return $p; }
28 function f3_soft($p): @string
{ return $p; }
29 function f4($p): bool { return $p; }
30 function f4_soft($p): @bool
{ return $p; }
31 function f5($p): float { return $p; }
32 function f5_soft($p): @float
{ return $p; }
33 function f6($p): resource { return $p; }
34 function f6_soft($p): @resource
{ return $p; }
35 function f7($p): array { return $p; }
36 function f7_soft($p): @array
{ return $p; }
37 function f8($p): callable
{ return $p; }
38 function f8_soft($p): @callable
{ return $p; }
39 function f9($p): Shapes
{ return $p; }
40 function f9_soft($p): @Shapes
{ return $p; }
41 function f10($p): Square
{ return $p; }
42 function f10_soft($p): @Square
{ return $p; }
43 function f11($p): :div
{ return $p; }
44 function f11_soft($p): @:div
{ return $p; }
45 function f12($p): Fractal
<Square
> { return $p; }
46 function f12_soft($p): @Fractal
<Square
> { return $p; }
47 function f13
<T
>($p): Fractal
<T
> { return $p; }
48 function f13_soft
<T
>($p): @Fractal
<T
> { return $p; }
49 function f14($p): my_t
{ return $p; }
50 function f14_soft($p): @my_t
{ return $p; }
51 function f15($p): void
{ return $p; }
52 function f15_soft($p): @void
{ return $p; }
53 function f16($p): mixed { return $p; }
54 function f16_soft($p): @mixed
{ return $p; }
55 function f17($p): ?
int { return $p; }
56 function f17_soft($p): @?
int { return $p; }
57 function f18($p): (string, int) { return $p; }
58 function f18_soft($p): @(string, int) { return $p; }
59 function f19($p): (function(int): int) { return $p; }
60 function f19_soft($p): @(function(int): int) { return $p; }
61 function f20($p): callable
{ return $p; }
62 function f20_soft($p): @callable
{ return $p; }
65 class Square
extends Shapes
{}
66 class Fractal
<T
> extends Shapes
{}
71 public function f21(): this
{ return $this; }
72 public function f21_soft(): @this
{ return $this; }
73 public function f22($p): this
{ return $p; }
74 public function f22_soft($p): @this
{ return $p; }
75 public static function f23($p): self
{ return $p; }
76 public static function f23_soft($p): @self
{ return $p; }
77 public static function f24($p): parent
{ return $p; }
78 public static function f24_soft($p): @parent
{ return $p; }
79 public static function testfunc() {}
83 function testfunc() {}
85 function call_wrapper($fn, $arg) {
88 } catch (Exception
$e) {
89 echo "Caught exception: " . $e->getMessage() . "\n";
94 for ($i = 1; $i <= 20; $i++
) {
95 foreach (array('', '_soft') as $suffix) {
96 if ($suffix !== '' && $i === 1) {
97 // f1_soft() does not exist
100 $f = 'f' . $i . $suffix;
101 echo "\ncalling $f\n";
102 call_wrapper($f, null);
103 call_wrapper($f, 42);
104 call_wrapper($f, 'foobar');
105 call_wrapper($f, true);
106 call_wrapper($f, 14.1);
107 call_wrapper($f, STDIN
);
108 call_wrapper($f, array());
109 call_wrapper($f, function($x){return $x*$x;});
110 call_wrapper($f, new Shapes());
111 call_wrapper($f, new Square());
112 call_wrapper($f, new Fractal());
113 call_wrapper($f, <div
/>);
114 call_wrapper($f, 'testfunc');
115 call_wrapper($f, array('C', 'testfunc'));
120 echo "\ncalling f21\n";
123 } catch (Exception
$e) {
124 echo "Caught exception: " . $e->getMessage() . "\n";
128 } catch (Exception
$e) {
129 echo "Caught exception: " . $e->getMessage() . "\n";
133 'f22' => array($c, 'f22'),
134 'f22_soft' => array($c, 'f22_soft'),
135 'f23' => array('C', 'f23'),
136 'f23_soft' => array('C', 'f23_soft'),
137 'f24' => array('C', 'f24'),
138 'f24_soft' => array('C', 'f24_soft')
140 foreach ($callbacks as $name => $f) {
141 echo "\ncalling $name\n";
142 call_wrapper($f, null);
143 call_wrapper($f, 42);
144 call_wrapper($f, 'foobar');
145 call_wrapper($f, true);
146 call_wrapper($f, 14.1);
147 call_wrapper($f, STDIN
);
148 call_wrapper($f, array());
149 call_wrapper($f, function($x){return $x*$x;});
150 call_wrapper($f, new Shapes());
151 call_wrapper($f, new Square());
152 call_wrapper($f, new Fractal());
153 call_wrapper($f, <div
/>);
154 call_wrapper($f, new A());
155 call_wrapper($f, new B());
156 call_wrapper($f, new C());