Open
Conversation
quasilyte
reviewed
Sep 7, 2021
In PHP, a regular `switch` uses non-strict comparison, which leads to type casts, but the `match` uses strict comparison, which is why we need a new `is_match` flag in the `op_switch` node. If this flag is set, then strict comparison will be used when generating the code for the `switch`.
|
Is it possible to add here some kind of annotation to force exhaustion check at compile time instead of runtime |
Contributor
Author
|
@Danil42Russia review please |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
RFC: https://wiki.php.net/rfc/match_expression_v2
The basis is the conversion to rvalue statements list with
switchwith strict comparisons. Forop_switchaddedis_matchflag.In PHP, a regular
switchuses non-strict comparison, which leads to type casts, but thematchuses strict comparison, which is why we need a newis_matchflag in theop_switchnode.If this flag is set, then strict comparison will be used when generating the code for the
switch.If we consider the transformation superficially, then the following will be:
For example:
Converts to something like this:
If there are several conditions, then the code is generated only once
and all conditions fallthrough to this code:
For example:
Converts to something like this:
If there is no
defaultbranch, then the default version is generated.The default version always gives a warning about an unhandled value.
For example:
Converts to something like this:
Checks
switch, we automatically get a check for a duplicate.default