Skip to content

Commit 7da985c

Browse files
Firehedclaude
andcommitted
Add test coverage for GMP operator overloads and gmp_* functions
This adds comprehensive type inference tests for GMP operations: - Arithmetic operators (+, -, *, /, %, **) with GMP on left and right - Bitwise operators (&, |, ^, ~, <<, >>) with GMP on left and right - Comparison operators (<, <=, >, >=, ==, !=, <=>) with GMP on left and right - Assignment operators (+=, -=, *=) - Corresponding gmp_* functions (gmp_add, gmp_sub, gmp_mul, etc.) These tests currently fail because PHPStan lacks a GmpOperatorTypeSpecifyingExtension to specify that GMP operations return GMP rather than int|float. Related: phpstan/phpstan#12123 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent b6c48a0 commit 7da985c

File tree

1 file changed

+192
-0
lines changed

1 file changed

+192
-0
lines changed
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
<?php
2+
3+
namespace GmpOperatorsTest;
4+
5+
use function PHPStan\Testing\assertType;
6+
7+
// =============================================================================
8+
// Operator overloads
9+
// =============================================================================
10+
11+
function gmpArithmeticOperators(\GMP $a, \GMP $b): void
12+
{
13+
assertType('GMP', $a + $b);
14+
assertType('GMP', $a - $b);
15+
assertType('GMP', $a * $b);
16+
assertType('GMP', $a / $b);
17+
assertType('GMP', $a % $b);
18+
assertType('GMP', $a ** $b);
19+
assertType('GMP', -$a);
20+
}
21+
22+
function gmpWithIntOperators(\GMP $a, int $i): void
23+
{
24+
// GMP on left
25+
assertType('GMP', $a + $i);
26+
assertType('GMP', $a - $i);
27+
assertType('GMP', $a * $i);
28+
assertType('GMP', $a / $i);
29+
assertType('GMP', $a % $i);
30+
assertType('GMP', $a ** $i);
31+
32+
// int on left (GMP on right)
33+
assertType('GMP', $i + $a);
34+
assertType('GMP', $i - $a);
35+
assertType('GMP', $i * $a);
36+
assertType('GMP', $i / $a);
37+
assertType('GMP', $i % $a);
38+
// Note: $i ** $a is not supported by GMP - exponent must be int
39+
}
40+
41+
function gmpBitwiseOperators(\GMP $a, \GMP $b, int $i): void
42+
{
43+
// GMP bitwise with GMP
44+
assertType('GMP', $a & $b);
45+
assertType('GMP', $a | $b);
46+
assertType('GMP', $a ^ $b);
47+
assertType('GMP', ~$a);
48+
assertType('GMP', $a << $b);
49+
assertType('GMP', $a >> $b);
50+
51+
// GMP on left, int on right
52+
assertType('GMP', $a & $i);
53+
assertType('GMP', $a | $i);
54+
assertType('GMP', $a ^ $i);
55+
assertType('GMP', $a << $i);
56+
assertType('GMP', $a >> $i);
57+
58+
// int on left, GMP on right
59+
assertType('GMP', $i & $a);
60+
assertType('GMP', $i | $a);
61+
assertType('GMP', $i ^ $a);
62+
}
63+
64+
function gmpComparisonOperators(\GMP $a, \GMP $b, int $i): void
65+
{
66+
// GMP compared with GMP
67+
assertType('bool', $a < $b);
68+
assertType('bool', $a <= $b);
69+
assertType('bool', $a > $b);
70+
assertType('bool', $a >= $b);
71+
assertType('bool', $a == $b);
72+
assertType('bool', $a != $b);
73+
assertType('int<-1, 1>', $a <=> $b);
74+
75+
// GMP on left, int on right
76+
assertType('bool', $a < $i);
77+
assertType('bool', $a <= $i);
78+
assertType('bool', $a > $i);
79+
assertType('bool', $a >= $i);
80+
assertType('bool', $a == $i);
81+
assertType('bool', $a != $i);
82+
assertType('int<-1, 1>', $a <=> $i);
83+
84+
// int on left, GMP on right
85+
assertType('bool', $i < $a);
86+
assertType('bool', $i <= $a);
87+
assertType('bool', $i > $a);
88+
assertType('bool', $i >= $a);
89+
assertType('bool', $i == $a);
90+
assertType('bool', $i != $a);
91+
assertType('int<-1, 1>', $i <=> $a);
92+
}
93+
94+
function gmpAssignmentOperators(\GMP $a, int $i): void
95+
{
96+
$x = $a;
97+
$x += $i;
98+
assertType('GMP', $x);
99+
100+
$y = $a;
101+
$y -= $i;
102+
assertType('GMP', $y);
103+
104+
$z = $a;
105+
$z *= $i;
106+
assertType('GMP', $z);
107+
}
108+
109+
// =============================================================================
110+
// gmp_* functions (corresponding to operator overloads)
111+
// =============================================================================
112+
113+
function gmpArithmeticFunctions(\GMP $a, \GMP $b, int $i): void
114+
{
115+
// gmp_add corresponds to +
116+
assertType('GMP', gmp_add($a, $b));
117+
assertType('GMP', gmp_add($a, $i));
118+
assertType('GMP', gmp_add($i, $a));
119+
120+
// gmp_sub corresponds to -
121+
assertType('GMP', gmp_sub($a, $b));
122+
assertType('GMP', gmp_sub($a, $i));
123+
assertType('GMP', gmp_sub($i, $a));
124+
125+
// gmp_mul corresponds to *
126+
assertType('GMP', gmp_mul($a, $b));
127+
assertType('GMP', gmp_mul($a, $i));
128+
assertType('GMP', gmp_mul($i, $a));
129+
130+
// gmp_div_q corresponds to /
131+
assertType('GMP', gmp_div_q($a, $b));
132+
assertType('GMP', gmp_div_q($a, $i));
133+
134+
// gmp_div is alias of gmp_div_q
135+
assertType('GMP', gmp_div($a, $b));
136+
137+
// gmp_mod corresponds to %
138+
assertType('GMP', gmp_mod($a, $b));
139+
assertType('GMP', gmp_mod($a, $i));
140+
141+
// gmp_pow corresponds to **
142+
assertType('GMP', gmp_pow($a, 2));
143+
assertType('GMP', gmp_pow($a, $i));
144+
145+
// gmp_neg corresponds to unary -
146+
assertType('GMP', gmp_neg($a));
147+
148+
// gmp_abs (no direct operator)
149+
assertType('GMP', gmp_abs($a));
150+
}
151+
152+
function gmpBitwiseFunctions(\GMP $a, \GMP $b): void
153+
{
154+
// gmp_and corresponds to &
155+
assertType('GMP', gmp_and($a, $b));
156+
157+
// gmp_or corresponds to |
158+
assertType('GMP', gmp_or($a, $b));
159+
160+
// gmp_xor corresponds to ^
161+
assertType('GMP', gmp_xor($a, $b));
162+
163+
// gmp_com corresponds to ~
164+
assertType('GMP', gmp_com($a));
165+
}
166+
167+
function gmpComparisonFunctions(\GMP $a, \GMP $b, int $i): void
168+
{
169+
// gmp_cmp corresponds to <=>
170+
assertType('int<-1, 1>', gmp_cmp($a, $b));
171+
assertType('int<-1, 1>', gmp_cmp($a, $i));
172+
}
173+
174+
function gmpFromInit(): void
175+
{
176+
$x = gmp_init('1');
177+
assertType('GMP', $x);
178+
179+
// Operator with gmp_init result
180+
$y = $x * 2;
181+
assertType('GMP', $y);
182+
183+
$z = $x + gmp_init('5');
184+
assertType('GMP', $z);
185+
}
186+
187+
function gmpWithNumericString(\GMP $a, string $s): void
188+
{
189+
// GMP functions accept numeric strings
190+
assertType('GMP', gmp_add($a, '123'));
191+
assertType('GMP', gmp_mul($a, '456'));
192+
}

0 commit comments

Comments
 (0)