Skip to content

Fix constant() enum case identity for class consts (#5682) - #8627

Merged
PurHur merged 1 commit into
masterfrom
agent/stdlib-constant-enum-class-5682
Jun 15, 2026
Merged

PurHur merged 1 commit into
masterfrom
agent/stdlib-constant-enum-class-5682

Conversation

@PurHur

@PurHur PurHur commented Jun 15, 2026

Copy link
Copy Markdown
Owner

Summary

  • constant('C::X') when C::X = E::A now returns the canonical enum case singleton via EnumCaseSupport::materializeConstantValue() on class-const lookup (VmConstants, VM::copyClassConstOrStaticPropertyByName).
  • === between enum cases compares declaring enum FQCN + case name instead of ClassEntry object identity, fixing mismatches between compile-time stub entries and runtime enum classes (declare(strict_types=1) repro).

php-src reference: ext/standard/basic_functions.c (zif_constant), Zend/zend_enum.c (case singleton identity)

PHP implementation: ext/standard/VmConstants.php, lib/VM.php, lib/VM/EnumCaseSupport.php — no runtime/ C changes.

Closes #5682

Verification

./script/docker-exec.sh -- bash -lc 'source script/php-env.sh
php bin/vm.php test/repro-maintainer/parity_constant_class_enum_const.php
./vendor/bin/phpunit --filter constant_class_enum
php bin/compile.php -l test/repro-maintainer/parity_constant_class_enum_const.php
'

Output:

enum(E::A)
same
E
OK (1 test, 1 assertion)
exit=0

Made with Cursor

…#5682).

Canonicalize enum singletons on constant()/class-const fetch and compare enum cases by FQCN + case name so compile-time stubs match runtime entries.

Co-authored-by: Cursor <cursoragent@cursor.com>
@PurHur
PurHur merged commit ee31589 into master Jun 15, 2026
@PurHur
PurHur deleted the agent/stdlib-constant-enum-class-5682 branch June 15, 2026 02:13
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.

Stdlib: constant() must resolve enum case constants (E::A, dynamic E::$name) (zend_constants.c)

1 participant