GMP operations with operator overloads give false-positive errors
Bug report
PHPStan is incorrectly yielding errors like the following:
155 Binary operation "**" between GMP and 3 results in an error.
156 Binary operation "*" between GMP and GMP results in an error.
157 Binary operation "+" between (array|float|int) and GMP results in an error.
159 Binary operation "**" between GMP and 2 results in an error.
This has been supported since PHP 5.6, though admittedly the documentation isn't amazing .
I'll check if this can be handled through the existing signature stub file, but I suspect that's not possible due to the engine's operator overloading for the GMP class. I don't have a comprehensive list, but at the very least, the following are supported through operator overloads:
- gmp_add
- gmp_sub
- gmp_mul
- gmp_div/gmp_div_q
- gmp_mod
Based on the RFC, I think and, or, xor are also supported, and maybe some of the other bit twiddling functions. gmp_cmp is as well, but there are some other subtleties to its use (=== remains reference equality, which almost certainly is not what you want for how its used)
Code snippet that reproduces the problem
https://phpstan.org/r/803a8194-e77f-47dd-bc68-7efb89014f7d
Expected output
No errors:
Did PHPStan help you today? Did it make you happy in any way?
It remains awesome and I'm looking forward to my elephant arriving!