@@ -319,7 +319,7 @@ public function processAssignVar(
319319 $ nodeScopeResolver ->callNodeCallback ($ nodeCallback , new VariableAssignNode ($ var , $ assignedExpr ), $ scopeBeforeAssignEval , $ storage );
320320 $ scope = $ scope ->assignVariable ($ var ->name , $ type , $ scope ->getNativeType ($ assignedExpr ), TrinaryLogic::createYes ());
321321 foreach ($ conditionalExpressions as $ exprString => $ holders ) {
322- $ scope = $ scope ->addConditionalExpressions ($ exprString , $ holders );
322+ $ scope = $ scope ->addConditionalExpressions (( string ) $ exprString , $ holders );
323323 }
324324
325325 if ($ assignedExpr instanceof Expr \Array_) {
@@ -861,6 +861,8 @@ private function processSureTypesForConditionalExpressionsAfterAssign(Scope $sco
861861 continue ;
862862 }
863863
864+ $ exprString = (string ) $ exprString ;
865+
864866 if (!isset ($ conditionalExpressions [$ exprString ])) {
865867 $ conditionalExpressions [$ exprString ] = [];
866868 }
@@ -889,6 +891,8 @@ private function processSureNotTypesForConditionalExpressionsAfterAssign(Scope $
889891 continue ;
890892 }
891893
894+ $ exprString = (string ) $ exprString ;
895+
892896 if (!isset ($ conditionalExpressions [$ exprString ])) {
893897 $ conditionalExpressions [$ exprString ] = [];
894898 }
@@ -938,7 +942,7 @@ private function isExprSafeToProjectThroughVariable(Expr $expr, string $variable
938942 // narrowing targets at a usage site — skip them so they don't collide with PHP's
939943 // numeric-string array-key autocast or leak internal virtual expressions into the
940944 // conditional-expression map.
941- if ($ expr instanceof Node \Scalar || $ expr instanceof ConstFetch || $ expr instanceof VirtualNode) {
945+ if ($ expr instanceof Node \Scalar || $ expr instanceof ConstFetch || $ expr instanceof VirtualNode || $ expr instanceof Expr \UnaryMinus && $ expr -> expr instanceof Node \Scalar ) {
942946 return false ;
943947 }
944948
0 commit comments