[php-src] Issue #7792: Wrong error message if Enum doesn't correctly implement an interface
| From: | KalleZ | 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