Category
stdlib · php-src-strict · regression
Problem
Zend min() / max() with backed enum case operands compares backing values and returns the winning enum case object. Closed #5570 / #5707 added VmMinMax::tryReduceEnumCasesTwoArg(), but VM still returns backing scalars (e.g. 1 instead of \E::A).
php-src reference
Repro
<?php
enum E: int { case A = 1; case B = 2; }
var_export(min(E::A, E::B));
echo "\n";
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh
php -r "enum E: int { case A=1; case B=2; } var_export(min(E::A,E::B)); echo \"\\n\";"
php bin/vm.php -r "enum E: int { case A=1; case B=2; } var_export(min(E::A,E::B)); echo \"\\n\";"'
| Engine |
Output |
| Zend PHP 8.3+ |
\E::A |
| This compiler VM (today) |
1 |
Also verify max(E::B, E::A) → \E::B, variadic min(E::A, E::B, …), and JIT/AOT when lowered.
Scope (this repo)
ext/standard/VmMinMax.php — tryReduceEnumCasesTwoArg(), finishEnumCaseReduce() must materialize enum case return zvals
lib/JIT/Builtin/*MinMax* — mirror enum return type
test/compliance/cases/stdlib/min_max_enum_case.phpt
Done when
Related
Category
stdlib· php-src-strict · regressionProblem
Zend
min()/max()with backed enum case operands compares backing values and returns the winning enum case object. Closed #5570 / #5707 addedVmMinMax::tryReduceEnumCasesTwoArg(), but VM still returns backing scalars (e.g.1instead of\E::A).php-src reference
ext/standard/array.c—php_min,php_max, enum-aware zval comparisonZend/zend_enum.cRepro
\E::A1Also verify
max(E::B, E::A)→\E::B, variadicmin(E::A, E::B, …), and JIT/AOT when lowered.Scope (this repo)
ext/standard/VmMinMax.php—tryReduceEnumCasesTwoArg(),finishEnumCaseReduce()must materialize enum case return zvalslib/JIT/Builtin/*MinMax*— mirror enum return typetest/compliance/cases/stdlib/min_max_enum_case.phptDone when
\E::Aon VM (not1)max()symmetric./script/ci-fast.sh --filter min_max_enumgreenRelated