Skip to content

Regression: class_alias() on enums — case fetch via alias returns backing scalar not enum object (re-#5765, zend_API.c) #9437

Description

@PurHur

Category

stdlib — php-src-strict enum alias resolution

Problem

class_alias('E', 'EAlias') registers the alias (closed #5765), but fetching a case through the alias (EAlias::A) returns the backing scalar (int(1)) instead of the enum case object. Zend returns enum(E::A) and EAlias::A === E::A is identity-true.

Compliance test/compliance/cases/stdlib/class_alias_enum.phpt currently fails alongside enum case TypeError guards.

php-src reference

Repro

./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && php bin/vm.php -r '"'"'enum E:int{case A=1;} class_alias("E","EAlias"); var_dump(EAlias::A); var_dump(EAlias::A === E::A);'"'"''

Zend:

enum(E::A)
bool(true)

This compiler (bin/vm.php):

int(1)
bool(false)

Full compliance:

php bin/vm.php test/compliance/cases/stdlib/class_alias_enum.phpt

Scope (PHP-in-PHP)

  • ext/standard/class_alias.php, ext/standard/VmClassAlias.php (if present)
  • lib/VM/Context.php — registerClassAlias for enums
  • lib/JIT/Builtin/Type/Object_.php — enum case fetch through aliased ClassEntry
  • ext/standard/JitClassAlias.php — JIT/AOT alias table must not scalarize enum cases

Done when (php-src-strict)

Related

#5765 (closed), #6583 (closed), #9152 (is_a on enums).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:vmVirtual machineenhancementNew feature or requestimplementation-readySpec complete: repro, php-src ref, done-when — safe for workers to claimphase-4:stdlibPhase 4 – stdlib for web appsstdlib

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions