diff --git a/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php b/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php index a580d420e92..62960a608d6 100644 --- a/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/Statements/Expression/Call/ArgumentsAnalyzer.php @@ -127,6 +127,10 @@ public static function analyze( break; } } + + if ($last_param && $last_param->is_variadic) { + $param = $last_param; + } } elseif ($argument_offset < count($function_params)) { $param = $function_params[$argument_offset]; } elseif ($last_param && $last_param->is_variadic) { diff --git a/tests/CallableTest.php b/tests/CallableTest.php index 1b84ad82191..f6c391c5120 100644 --- a/tests/CallableTest.php +++ b/tests/CallableTest.php @@ -85,6 +85,31 @@ public function __invoke(Closure $_fn): int 'error_levels' => [], '7.4', ], + 'inferArgFromClassContextWithNamedArguments' => [ + ' $_a + $_b, + bar: fn($_a, $_b) => $_a + $_b, + );', + 'assertions' => [ + '$a' => 'int', + ], + 'error_levels' => [], + '7.4', + ], 'varReturnType' => [ '