[php-src] Issue #7792: Wrong error message if Enum doesn't correctly implement an interface

From: Date: Sun, 19 Dec 2021 11:13:54 +0000
Subject: [php-src] Issue #7792: Wrong error message if Enum doesn't correctly implement an interface
Groups: php.bugs 
Request: Send a blank email to php-bugs+get-238480@lists.php.net to get a copy of this message
Issue: https://github.com/php/php-src/issues/7792 Author: KalleZ ### Description The following code: ```php <?php interface A { public function a(): void; } enum B implements A { } ``` Resulted in this output: ``` PHP Fatal error: Class E contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (I::a) in Command line code on line 1 ``` But I expected this output instead: ``` PHP Fatal error: Enum E contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (I::a) in Command line code on line 1 ``` Patch: ```diff diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 3ef291c315..04d5728ef1 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -4789,6 +4789,8 @@ ZEND_API ZEND_COLD const char *zend_get_object_type(const zend_class_entry *ce) return "trait"; } else if (ce->ce_flags & ZEND_ACC_INTERFACE) { return "interface"; + } else if (ce->ce_flags & ZEND_ACC_ENUM) { + return "enum"; } else { return "class"; } diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 82af3d8afa..002da24383 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -2324,9 +2324,13 @@ void zend_verify_abstract_class(zend_class_entry *ce) /* {{{ */ } ZEND_HASH_FOREACH_END(); if (ai.cnt) { + char* kind = strdup(zend_get_object_type(ce)); + kind[0] = toupper(kind[0]); + zend_error_noreturn(E_ERROR, !is_explicit_abstract - ? "Class %s contains %d abstract method%s and must therefore be declared abstract or implement the remaining methods (" MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT ")" - : "Class %s must implement %d abstract private method%s (" MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT ")", + ? "%s %s contains %d abstract method%s and must therefore be declared abstract or implement the remaining methods (" MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT ")" + : "%s %s must implement %d abstract private method%s (" MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT ")", + kind, ZSTR_VAL(ce->name), ai.cnt, ai.cnt > 1 ? "s" : "", DISPLAY_ABSTRACT_FN(0), ``` ### PHP Version 8.1.* ### Operating System Irrelevant

« previous php.bugs (#238480) next »