diff --git a/lib/Compiler.php b/lib/Compiler.php index 16a44ea804c..63046ecdb25 100755 --- a/lib/Compiler.php +++ b/lib/Compiler.php @@ -9828,6 +9828,12 @@ protected function assertCompileTimeDefaultMatchesDeclaredType( } $classOrScalarName = $this->declNameFromCfgType($checkType); + if (null !== $classOrScalarName && null !== $block) { + $resolvedClass = $this->resolveTypeHintClassName($classOrScalarName, $block); + if (null !== $resolvedClass && '' !== $resolvedClass) { + $classOrScalarName = $resolvedClass; + } + } if ( null !== $classOrScalarName && $this->compileTimeDefaultMatchesLiteralType($value, strtolower($classOrScalarName)) diff --git a/test/compliance/EnumVMTest.php b/test/compliance/EnumVMTest.php index 847fe71c0fa..e21f2429bd4 100644 --- a/test/compliance/EnumVMTest.php +++ b/test/compliance/EnumVMTest.php @@ -104,6 +104,7 @@ public static function providePHPTests(): \Generator 'enum_backed_int_value.phpt', 'enum_method.phpt', 'enum_default_parameter.phpt', + 'enum_self_type_default_parameter.phpt', 'enum_default_param_property.phpt', 'enum_property_default.phpt', 'static_enum_property_default.phpt', diff --git a/test/compliance/cases/language/enum_self_type_default_parameter.phpt b/test/compliance/cases/language/enum_self_type_default_parameter.phpt new file mode 100644 index 00000000000..a0972e2abc5 --- /dev/null +++ b/test/compliance/cases/language/enum_self_type_default_parameter.phpt @@ -0,0 +1,17 @@ +--TEST-- +Language: enum method/static parameter default self $e = self::CASE (zend_compile.c, #22085) +--FILE-- +name; + } + public static function make(self $e = self::B): string { + return $e->name; + } +} +echo E::A->other(), "|", E::make(), "\n"; +--EXPECT-- +A|B