Category
language
Problem
Enum types cannot resolve class constants declared on the enum itself or inherited via traits/interfaces. E::X throws Error: Undefined class constant E::X in the VM; Zend returns the constant value.
Related stdlib gaps (#5682, #3484) cover constant('E::A') for enum cases, not public const / trait const on enum types.
php-src-strict: direct E::X, constant('E::X'), and trait-merged constants must match Zend.
php-src reference
Repro (failure today)
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh
php bin/vm.php test/repro/maintainer_enum_class_constant.php # Error: Undefined class constant E::X
php bin/vm.php test/repro/parity_enum_trait_const.php # trait const on enum — same failure
php test/repro/maintainer_enum_class_constant.php # Zend: 42
php test/repro/parity_enum_trait_const.php # Zend: 1
'
<?php
// enum-declared constant
enum E { case A; public const X = 42; }
echo E::X; // VM: Error; Zend: 42
// trait constant on enum
trait T { public const X = 1; }
enum E { use T; }
echo E::X; // VM: Error; Zend: 1
Implementation hints (PHP-in-PHP)
- Register enum constants in compiler symbol tables (
lib/ lowering), not new C branches in runtime/.
- Trait/interface constant merge should reuse existing trait merge paths; ensure enum
TYPE_ENUM stores constants separately from case objects.
- VM:
FETCH_CLASS_CONSTANT / ClassConstFetch for enums must read enum constant table, not only case materialization.
- Add
test/compliance/cases/language/enum_class_constant.phpt + trait variant; JIT/AOT when enum const fetch is lowered.
Verification
- Repro scripts above green on VM
- Filter:
vendor/bin/phpunit test/compliance/VMTest.php --filter enum_class_constant (after adding case)
Category
languageProblem
Enum types cannot resolve class constants declared on the enum itself or inherited via traits/interfaces.
E::XthrowsError: Undefined class constant E::Xin the VM; Zend returns the constant value.Related stdlib gaps (#5682, #3484) cover
constant('E::A')for enum cases, notpublic const/ traitconston enum types.php-src-strict: direct
E::X,constant('E::X'), and trait-merged constants must match Zend.php-src reference
Zend/zend_enum.c— enum constant tableZend/zend_constants.c—zend_fetch_class_constant_ex()Zend/zend_compile.c— trait const merge on enumsRepro (failure today)
Implementation hints (PHP-in-PHP)
lib/lowering), not new C branches inruntime/.TYPE_ENUMstores constants separately from case objects.FETCH_CLASS_CONSTANT/ClassConstFetchfor enums must read enum constant table, not only case materialization.test/compliance/cases/language/enum_class_constant.phpt+ trait variant; JIT/AOT when enum const fetch is lowered.Verification
vendor/bin/phpunit test/compliance/VMTest.php --filter enum_class_constant(after adding case)