Skip to content

Fix filter_var throw-on-failure detection - #65

Closed
simPod wants to merge 1 commit into
masterfrom
fix-filter-var-throw-on-failure
Closed

simPod wants to merge 1 commit into
masterfrom
fix-filter-var-throw-on-failure

Conversation

@simPod

@simPod simPod commented Jul 12, 2026 •

Copy link
Copy Markdown
Owner

Problem

filter_var() accepts options and flags in its third argument.

FilterVarThrowTypeExtension was reading the fourth argument instead, so valid calls like this were not treated as throwing:

filter_var($value, FILTER_VALIDATE_MAC, FILTER_THROW_ON_FAILURE);

That made catch (Filter\FilterFailedException) look dead even though the return type helper already narrowed the return type correctly.

Fix

Read the third argument in FilterVarThrowTypeExtension and reuse FilterFunctionReturnTypeHelper::hasFlag().

This keeps throw detection consistent for both forms:

filter_var($value, FILTER_VALIDATE_MAC, FILTER_THROW_ON_FAILURE);
filter_var($value, FILTER_VALIDATE_MAC, ['flags' => FILTER_THROW_ON_FAILURE]);

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes PHPStan’s throw-type detection for filter_var() when FILTER_THROW_ON_FAILURE is passed via the third argument (options/flags), aligning throw detection with the existing return-type narrowing logic.

Changes:

  • Update FilterVarThrowTypeExtension to read the 3rd argument ($options) instead of the 4th and delegate flag detection to FilterFunctionReturnTypeHelper::hasFlag().
  • Add a regression test case covering both FILTER_THROW_ON_FAILURE forms (int flags and ['flags' => ...] array) gated to PHP >= 8.5.
  • Wire the new test data into CatchWithUnthrownExceptionRuleTest.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

File Description
tests/PHPStan/Rules/Exceptions/data/filter-var-throw-on-failure.php Adds regression examples where filter_var() should be recognized as throwing Filter\FilterFailedException.
tests/PHPStan/Rules/Exceptions/CatchWithUnthrownExceptionRuleTest.php Runs the new regression file under PHP >= 8.5.0.
src/Type/Php/FilterVarThrowTypeExtension.php Fixes argument indexing and reuses shared flag-detection logic for consistent throw inference.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@simPod simPod closed this Jul 12, 2026
@simPod
simPod deleted the fix-filter-var-throw-on-failure branch July 14, 2026 07:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants