From f595b4eed386a7ba6248473f52e8c598eb5bc561 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 28 Feb 2026 16:01:44 +0000 Subject: [PATCH] Fix @param-out conditional check not using default value for undefined variables - When an undefined variable is passed to a by-reference parameter with a default value, use the default value type for resolving conditional @param-out types - In GenericParametersAcceptorResolver::resolve, ErrorType arguments now fall back to the parameter's default value - New regression test in tests/PHPStan/Analyser/nsrt/bug-12687.php Closes https://github.com/phpstan/phpstan/issues/12687 --- .../GenericParametersAcceptorResolver.php | 3 ++ tests/PHPStan/Analyser/nsrt/bug-12687.php | 42 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 tests/PHPStan/Analyser/nsrt/bug-12687.php diff --git a/src/Reflection/GenericParametersAcceptorResolver.php b/src/Reflection/GenericParametersAcceptorResolver.php index 27d8cfc11c..e22958f0a2 100644 --- a/src/Reflection/GenericParametersAcceptorResolver.php +++ b/src/Reflection/GenericParametersAcceptorResolver.php @@ -59,6 +59,9 @@ public static function resolve(array $argTypes, ParametersAcceptor $parametersAc foreach ($parameters as $param) { if (isset($namedArgTypes[$param->getName()])) { $argType = $namedArgTypes[$param->getName()]; + if ($argType instanceof ErrorType && $param->getDefaultValue() !== null) { + $argType = $param->getDefaultValue(); + } } elseif ($param->getDefaultValue() !== null) { $argType = $param->getDefaultValue(); } else { diff --git a/tests/PHPStan/Analyser/nsrt/bug-12687.php b/tests/PHPStan/Analyser/nsrt/bug-12687.php new file mode 100644 index 0000000000..5bb9e142e9 --- /dev/null +++ b/tests/PHPStan/Analyser/nsrt/bug-12687.php @@ -0,0 +1,42 @@ +