From 31ef559712dae57046b6377f07634ad57f9d88cf Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 19 Nov 2011 13:36:03 +0000 Subject: [PATCH] - Fixed bug #43200 (Interface implementation / inheritence not possible in abstract classes) --- NEWS | 4 +++ Zend/tests/bug43200.phpt | 51 ++++++++++++++++++++++++++++++++++++++ Zend/tests/bug43200_2.phpt | 25 +++++++++++++++++++ Zend/zend_compile.c | 3 ++- 4 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/bug43200.phpt create mode 100644 Zend/tests/bug43200_2.phpt diff --git a/NEWS b/NEWS index 40c0661eaf..203fe9e38e 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,10 @@ PHP NEWS (klightspeed at netspace dot net dot au) . Fixed bug #52624 (tempnam() by-pass open_basedir with nonnexistent directory). (Felipe) + +- Zend Engine: + . Fixed bug #43200 (Interface implementation / inheritence not possible in + abstract classes). (Felipe) - PHP-FPM SAPI: . Fixed bug #60179 (php_flag and php_value does not work properly). (fat) diff --git a/Zend/tests/bug43200.phpt b/Zend/tests/bug43200.phpt new file mode 100644 index 0000000000..24a8bbb1d7 --- /dev/null +++ b/Zend/tests/bug43200.phpt @@ -0,0 +1,51 @@ +--TEST-- +Bug #43200 (Interface implementation / inheritence not possible in abstract classes) +--FILE-- + +--EXPECTF-- +Class [ class x extends c implements a, b ] { + @@ %s 15-17 + + - Constants [0] { + } + + - Static properties [0] { + } + + - Static methods [0] { + } + + - Properties [0] { + } + + - Methods [2] { + Method [ public method foo ] { + @@ %s 16 - 16 + } + + Method [ public method bar ] { + @@ %s 12 - 12 + } + } +} + diff --git a/Zend/tests/bug43200_2.phpt b/Zend/tests/bug43200_2.phpt new file mode 100644 index 0000000000..5efc5facff --- /dev/null +++ b/Zend/tests/bug43200_2.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #43200.2 (Interface implementation / inheritence not possible in abstract classes) +--FILE-- +foo(); + +?> +--EXPECTF-- +works diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 1248715f12..0b881098cf 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2628,7 +2628,8 @@ static zend_bool do_inherit_method_check(HashTable *child_function_table, zend_f return 1; /* method doesn't exist in child, copy from parent */ } - if (parent->common.fn_flags & ZEND_ACC_ABSTRACT + if ((parent->common.scope->ce_flags & ZEND_ACC_INTERFACE) == 0 + && parent->common.fn_flags & ZEND_ACC_ABSTRACT && parent->common.scope != (child->common.prototype ? child->common.prototype->common.scope : child->common.scope) && child->common.fn_flags & (ZEND_ACC_ABSTRACT|ZEND_ACC_IMPLEMENTED_ABSTRACT)) { zend_error(E_COMPILE_ERROR, "Can't inherit abstract function %s::%s() (previously declared abstract in %s)", -- 2.50.1