diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php b/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php index 241f22cdb67..4e68b734f9e 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/AssignmentAnalyzer.php @@ -277,6 +277,10 @@ public static function analyze( } if ($array_var_id && isset($context->vars_in_scope[$array_var_id])) { + if ($context->vars_in_scope[$array_var_id]->by_ref) { + $assign_value_type->by_ref = true; + } + // removes dependennt vars from $context $context->removeDescendents( $array_var_id, @@ -419,7 +423,7 @@ public static function analyze( ); } - if (isset($context->byref_constraints[$var_id])) { + if (isset($context->byref_constraints[$var_id]) || $assign_value_type->by_ref) { $statements_analyzer->registerVariableUses([$location->getHash() => $location]); } } elseif ($assign_var instanceof PhpParser\Node\Expr\List_ @@ -1025,6 +1029,8 @@ public static function analyzeAssignmentRef( return false; } + $assignment_type->by_ref = true; + $lhs_var_id = ExpressionAnalyzer::getVarId( $stmt->var, $statements_analyzer->getFQCLN(), diff --git a/tests/UnusedVariableTest.php b/tests/UnusedVariableTest.php index 314890e4a80..f1da8695b38 100644 --- a/tests/UnusedVariableTest.php +++ b/tests/UnusedVariableTest.php @@ -1317,6 +1317,16 @@ function keys(): array { echo gettype($k); }' ], + 'byRefVariableAfterAssignment' => [ + 'value; + $update = $value; + } + }' + ], ]; }