@@ -152,9 +152,9 @@ function (int $a, int $b, int $c): void {
152152
153153 assertType ('int<14, max> ' , $ c );
154154
155- assertType ('int ' , $ a * $ b );
156- assertType ('int ' , $ b * $ c );
157- assertType ('int ' , $ a * $ b * $ c );
155+ assertType ('int<156, max> ' , $ a * $ b );
156+ assertType ('int<182, max> ' , $ b * $ c );
157+ assertType ('int<2184, max> ' , $ a * $ b * $ c );
158158};
159159
160160class X {
@@ -194,4 +194,88 @@ public function supportsPhpdocIntegerRange() {
194194 assertType ('*ERROR* ' , $ this ->error2 );
195195 assertType ('int ' , $ this ->int );
196196 }
197+
198+ /**
199+ * @param int $i
200+ * @param 1|2|3 $j
201+ * @param 1|-20|3 $z
202+ * @param positive-int $pi
203+ * @param int<1, 10> $r1
204+ * @param int<5, 10> $r2
205+ * @param int<min, 5> $rMin
206+ * @param int<5, max> $rMax
207+ *
208+ * @param 20|40|60 $x
209+ * @param 2|4 $y
210+ */
211+ public function math ($ i , $ j , $ z , $ pi , $ r1 , $ r2 , $ rMin , $ rMax , $ x , $ y ) {
212+ assertType ('int ' , $ r1 + $ i );
213+ assertType ('int ' , $ r1 - $ i );
214+ assertType ('int ' , $ r1 * $ i );
215+ assertType ('(float|int) ' , $ r1 / $ i );
216+
217+ assertType ('int<2, 13> ' , $ r1 + $ j );
218+ assertType ('int<-2, 9> ' , $ r1 - $ j );
219+ assertType ('int<1, 30> ' , $ r1 * $ j );
220+ assertType ('float|int<0, 10> ' , $ r1 / $ j );
221+ assertType ('int<min, 15> ' , $ rMin * $ j );
222+ assertType ('int<5, max> ' , $ rMax * $ j );
223+
224+ assertType ('int<2, 13> ' , $ j + $ r1 );
225+ assertType ('int<-9, 2> ' , $ j - $ r1 );
226+ assertType ('int<1, 30> ' , $ j * $ r1 );
227+ assertType ('float|int<0, 3> ' , $ j / $ r1 );
228+ assertType ('int<min, 15> ' , $ j * $ rMin );
229+ assertType ('int<5, max> ' , $ j * $ rMax );
230+
231+ assertType ('int<-19, 13> ' , $ r1 + $ z );
232+ assertType ('int<-2, 30> ' , $ r1 - $ z );
233+ assertType ('int<-20, 30> ' , $ r1 * $ z );
234+ assertType ('float ' , $ r1 / $ z );
235+ assertType ('int<min, 15> ' , $ rMin * $ z );
236+ assertType ('int<-100, max> ' , $ rMax * $ z );
237+
238+ assertType ('int<2, max> ' , $ pi + 1 );
239+ assertType ('int<-1, max> ' , $ pi - 2 );
240+ assertType ('int<2, max> ' , $ pi * 2 );
241+ assertType ('float|int<0, max> ' , $ pi / 2 );
242+ assertType ('int<2, max> ' , 1 + $ pi );
243+ assertType ('int<1, max> ' , 2 - $ pi );
244+ assertType ('int<2, max> ' , 2 * $ pi );
245+ assertType ('float|int<2, max> ' , 2 / $ pi );
246+
247+ assertType ('int<5, 14> ' , $ r1 + 4 );
248+ assertType ('int<-3, 6> ' , $ r1 - 4 );
249+ assertType ('int<4, 40> ' , $ r1 * 4 );
250+ assertType ('float|int<0, 2> ' , $ r1 / 4 );
251+ assertType ('int<9, max> ' , $ rMax + 4 );
252+ assertType ('int<1, max> ' , $ rMax - 4 );
253+ assertType ('int<20, max> ' , $ rMax * 4 );
254+ assertType ('float|int<1, max> ' , $ rMax / 4 );
255+
256+ assertType ('int<6, 20> ' , $ r1 + $ r2 );
257+ assertType ('int<-4, 0> ' , $ r1 - $ r2 );
258+ assertType ('int<5, 100> ' , $ r1 * $ r2 );
259+ assertType ('float|int<0, 1> ' , $ r1 / $ r2 );
260+
261+ assertType ('int<min, 15> ' , $ r1 + $ rMin );
262+ assertType ('int<min, 5> ' , $ r1 - $ rMin );
263+ assertType ('int<min, 50> ' , $ r1 * $ rMin );
264+ assertType ('float|int<min, 2> ' , $ r1 / $ rMin );
265+ assertType ('int<min, 15> ' , $ rMin + $ r1 );
266+ assertType ('int<min, -5> ' , $ rMin - $ r1 );
267+ assertType ('int<min, 50> ' , $ rMin * $ r1 );
268+ assertType ('float|int<min, 0> ' , $ rMin / $ r1 );
269+
270+ assertType ('int<6, max> ' , $ r1 + $ rMax );
271+ assertType ('int<-4, max> ' , $ r1 - $ rMax );
272+ assertType ('int<5, max> ' , $ r1 * $ rMax );
273+ assertType ('float|int<0, max> ' , $ r1 / $ rMax );
274+ assertType ('int<6, max> ' , $ rMax + $ r1 );
275+ assertType ('int<4, max> ' , $ rMax - $ r1 );
276+ assertType ('int<5, max> ' , $ rMax * $ r1 );
277+ assertType ('float|int<5, max> ' , $ rMax / $ r1 );
278+
279+ assertType ('5|10|15|20|30 ' , $ x / $ y );
280+ }
197281}
0 commit comments