Repository navigation
Language: unit enum (pure enum) declarations — parse + VM (Zend zend_enum.c parity) #3404
Description
Activity
- addedenhancementNew feature or requestNew feature or requestphase-2:languagePhase 2 – language featuresPhase 2 – language featuresarea:compilerCompiler / CFG / JITCompiler / CFG / JITarea:vmVirtual machineVirtual machineimplementation-readySpec complete: repro, php-src ref, done-when — safe for workers to claimSpec complete: repro, php-src ref, done-when — safe for workers to claim
on May 29, 2026 claim: runforge-worker-lane-c — starting this run
Verification (runforge-worker-lane-c, this run):
PR #3411 — unit enum case objects on VM + compile-time JIT lowering.
- Issue repro:
php bin/vm.php -r 'enum E { case A; } echo E::A->name;'→A ./vendor/bin/phpunit --filter unit_enum— 4/4 OK (EnumVMTest + VmUnitEnumTest)./vendor/bin/phpunit test/compliance/EnumVMTest.php— 5/5 OK (backed + unit)
php-src ref:
Zend/zend_enum.c,Zend/zend_compile.cMCJIT execute for enum tests still segfaults on this harness (pre-existing #98); unit_enum PHPTs excluded from JITTest like other VM-first language cases.
- Issue repro:
claim: cursor-agent-lane-c — continuing PR #3411 this run
Update (cursor-agent-lane-c): Rebased onto master (#3420
EnumCaseEntry, #3554 clone guard) and rewrote VM path:- Unit enum cases stored as singleton
TYPE_ENUM_CASEinClassEntry::constantsatTYPE_DECLARE_CLASS_CONST TYPE_PROPERTY_FETCHon->name/->value(unitvalue→ undefined property)Variable::equals/===compare enum cases by class + case name
Verification:
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && php bin/vm.php -r "enum E { case A; } echo E::A->name;"' # A ./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && vendor/bin/phpunit --filter unit_enum'
PR #3411 updated on
agent/issue-3404-unit-enum. JIT execute remains VM-only (skipped inJITTest).- Unit enum cases stored as singleton
- added a commit that references this issue
on May 30, 2026 claim: cursor-agent-lane-c — continuing open PR #3411 this run
- added a commit that references this issue
on May 30, 2026 Update (cursor-agent-lane-c): Rebased PR #3411 onto current master (#3420 enum case objects). Remaining #3404 gaps closed:
- Unit enum cases stored as
TYPE_ENUM_CASEsingletons atTYPE_DECLARE_CLASS_CONST E::Case === E::Caseidentity by class + case name->valueon unit enum raisesUndefined property: E::$value(Zend message)- Compliance:
unit_enum_basic.phpt,unit_enum_case_name.phpt,VmUnitEnumTest
Verification:
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && vendor/bin/phpunit test/compliance/EnumVMTest.php --filter unit_enum test/unit/VmUnitEnumTest.php' # OK (3 tests)
php-src:
Zend/zend_enum.c— unit enum registration, case singletons.- Unit enum cases stored as
- added a commit that references this issue
on May 30, 2026 - added a commit that references this issue
on May 30, 2026
Category
languageProblem
Backed enums work (#1356), but pure/unit enums (
enum E { case A; }) crash during php-cfg parse. Verified May 2026:VM today:
Backed enum with
=values still parses (enum Status: string { case Active = 'x'; }).php-src reference
Zend/zend_enum.c— unit vs backed enum registrationZend/zend_compile.c—zend_compile_enumRepro (failure today)
Scope (this repo)
vendor/ircmaxell/php-cfgorpatches/*enum*—parseStmt_Enum()unit bodylib/Compiler.php—TYPE_DECLARE_ENUM/ case registrationlib/VM.php,lib/VM/BuiltinClasses.php— unit case singletonstest/compliance/cases/language/unit_enum_*.phptDone when
Aunderbin/vm.php(no PHPCfg fatal)E::Ais a case object with readonlyname(novalueon unit enums)enum_exists('E')is true after fix (Stdlib: get_declared_enums() — list compiled enum classes (ext/standard/basic_functions.c parity) #3538 follow-up if separate)./script/ci-fast.sh --filter unit_enumgreenVerification
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && php vendor/bin/phpunit --filter unit_enum' ./script/ci-fast.sh --filter unit_enumExpected behavior (Zend parity)
nameperUnitEnum::cases()), Language: enum user methods — parse + VM dispatch (Zend zend_enum.c parity) #3390 (user methods), Language: enum implements interface — parse + VM dispatch (Zend zend_enum.c parity) #3373 (implements interface), Language: instanceof on enum case values — case object is instance of enum (Zend zend_enum.c parity) #3550 (instanceofon cases)Implementation hints
parseStmt_Enum()/ patch for unit enum body (case list without scalar type)namepropertyunit_enum_basic.phpt,unit_enum_case_name.phptRelated