diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index c03813d9e74..85b80cc55eb 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -782,6 +782,13 @@ ZEND_API zend_result ZEND_FASTCALL zend_ast_evaluate(zval *result, zend_ast *ast : NULL; zend_class_entry *ce = zend_lookup_class(class_name); + if (!ce) { + /* Class may not be available when resolving constants on a dynamically + * declared enum during preloading. */ + ZEND_ASSERT(CG(compiler_options) & ZEND_COMPILE_PRELOAD); + return FAILURE; + } + zend_enum_new(result, ce, case_name, case_value_zv); break; } diff --git a/ext/opcache/tests/preload_enum.inc b/ext/opcache/tests/preload_enum.inc index c9501dcacbb..2955e99b954 100644 --- a/ext/opcache/tests/preload_enum.inc +++ b/ext/opcache/tests/preload_enum.inc @@ -10,3 +10,9 @@ class Test { public $x = MyEnum::Bar; } new Test; + +if (false) { + enum MyEnum2 { + case Foo; + } +} diff --git a/ext/opcache/tests/preload_enum.phpt b/ext/opcache/tests/preload_enum.phpt index 30422fd5641..b899692be96 100644 --- a/ext/opcache/tests/preload_enum.phpt +++ b/ext/opcache/tests/preload_enum.phpt @@ -17,7 +17,9 @@ var_dump(MyEnum::Foo); var_dump(MyEnum::Bar); ?> ---EXPECT-- +--EXPECTF-- enum(MyEnum::Bar) + +Warning: Can't preload unlinked class MyEnum2: Unknown reason in %s on line %d enum(MyEnum::Foo) enum(MyEnum::Bar)