Skip to content

Stdlib: is_subclass_of() on enum cases — UnitEnum/BackedEnum must be true (ext/standard/class.c) #5642

Description

@PurHur

Category

stdlib

Summary

is_subclass_of() on enum case objects must recognize the built-in UnitEnum / BackedEnum interfaces, matching Zend. Today the VM returns false for both backed and unit cases vs interface names.

Related: #5422 (class_implements() parity) — same instanceof_interface path in php-src; fix may share lib/VM/ enum case + interface checks.

php-src reference

Repro (today)

test/compliance/cases/stdlib/is_subclass_of_enum_case.phpt

<?php
enum E: int { case A = 1; }
enum U { case X; }
var_export(is_subclass_of(E::A, BackedEnum::class));
var_export(is_subclass_of(E::A, UnitEnum::class));
var_export(is_subclass_of(U::X, UnitEnum::class));
var_export(is_subclass_of(U::X, BackedEnum::class));
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && php bin/vm.php test/compliance/cases/stdlib/is_subclass_of_enum_case.phpt'
Call Zend VM today
is_subclass_of(E::A, BackedEnum::class) true false
is_subclass_of(E::A, UnitEnum::class) true false
is_subclass_of(U::X, UnitEnum::class) true false
is_subclass_of(U::X, BackedEnum::class) false false

Scope (PHP-in-PHP)

Done when

  • Repro table matches Zend on VM
  • is_subclass_of(E::A, 'BackedEnum') string form works (not only ::class)
  • JIT/AOT: follow-up issue if MCJIT path still returns false
  • PHPT green: is_subclass_of_enum_case.phpt

Verification

./script/docker-exec.sh -- bash -lc 'source script/php-env.sh && vendor/bin/phpunit --filter is_subclass_of_enum_case'

Links

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 apps

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions