Enable hard enforcement of return typehints by default
[hiphop-php.git] / hphp / test / quick / hh_return_type_0.php
blob9613d5374de692e9c961d541aec6cae26fff33bf
1 <?hh
2 // Copyright 2004-present Facebook. All Rights Reserved.
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($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; }
64 class Shapes {}
65 class Square extends Shapes {}
66 class Fractal<T> extends Shapes {}
67 class :div {}
69 class A {}
70 class B extends A {
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() {}
81 class C extends B {}
83 function testfunc() {}
85 function call_wrapper($fn, $arg) {
86 try {
87 $fn($arg);
88 } catch (Exception $e) {
89 echo "Caught exception: " . $e->getMessage() . "\n";
93 function main() {
94 for ($i = 1; $i <= 20; $i++) {
95 foreach (array('', '_soft') as $suffix) {
96 if ($suffix !== '' && $i === 1) {
97 // f1_soft() does not exist
98 continue;
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'));
119 $c = new C();
120 echo "\ncalling f21\n";
121 try {
122 $c->f21();
123 } catch (Exception $e) {
124 echo "Caught exception: " . $e->getMessage() . "\n";
126 try {
127 $c->f21_soft();
128 } catch (Exception $e) {
129 echo "Caught exception: " . $e->getMessage() . "\n";
132 $callbacks = Map {
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());
158 echo "Done\n";
160 main();