44
55use PhpParser \Node \Expr ;
66use PHPStan \Analyser \Scope ;
7+ use PHPStan \Php \PhpVersion ;
78use PHPStan \Rules \RuleLevelHelper ;
89use PHPStan \Type \Accessory \AccessoryNumericStringType ;
910use PHPStan \Type \BenevolentUnionType ;
1213use PHPStan \Type \IntegerType ;
1314use PHPStan \Type \IntersectionType ;
1415use PHPStan \Type \MixedType ;
16+ use PHPStan \Type \ObjectType ;
1517use PHPStan \Type \StringType ;
1618use PHPStan \Type \Type ;
1719use PHPStan \Type \UnionType ;
@@ -21,9 +23,12 @@ class OperatorRuleHelper
2123
2224 private RuleLevelHelper $ ruleLevelHelper ;
2325
24- public function __construct (RuleLevelHelper $ ruleLevelHelper )
26+ private PhpVersion $ phpVersion ;
27+
28+ public function __construct (RuleLevelHelper $ ruleLevelHelper , PhpVersion $ phpVersion )
2529 {
2630 $ this ->ruleLevelHelper = $ ruleLevelHelper ;
31+ $ this ->phpVersion = $ phpVersion ;
2732 }
2833
2934 public function isValidForArithmeticOperation (Scope $ scope , Expr $ expr ): bool
@@ -68,7 +73,13 @@ public function isValidForDecrement(Scope $scope, Expr $expr): bool
6873
6974 private function isSubtypeOfNumber (Scope $ scope , Expr $ expr ): bool
7075 {
71- $ acceptedType = new UnionType ([new IntegerType (), new FloatType (), new IntersectionType ([new StringType (), new AccessoryNumericStringType ()])]);
76+ $ acceptedTypes = [new IntegerType (), new FloatType (), new IntersectionType ([new StringType (), new AccessoryNumericStringType ()])];
77+
78+ if ($ this ->phpVersion ->supportsBcMathNumberOperatorOverloading ()) {
79+ $ acceptedTypes [] = new ObjectType ('BcMath\Number ' );
80+ }
81+
82+ $ acceptedType = new UnionType ($ acceptedTypes );
7283
7384 $ type = $ this ->ruleLevelHelper ->findTypeToCheck (
7485 $ scope ,
0 commit comments