]> granicus.if.org Git - php/commitdiff
fix #71414 (Interface method override inherited method and implemented in a trait...
authorJoe Watkins <krakjoe@php.net>
Sat, 26 Mar 2016 23:47:31 +0000 (23:47 +0000)
committerJoe Watkins <krakjoe@php.net>
Sat, 26 Mar 2016 23:47:31 +0000 (23:47 +0000)
Zend/tests/bug62358.phpt
Zend/tests/bug69467.phpt
Zend/tests/traits/bug60153.phpt
Zend/zend_compile.c

index 44480fc5ef3aa8fbd4d22f46c100b290c07d39f1..35bbc33835b0d557f90ed78e57f2c1c2c51638f5 100644 (file)
@@ -23,4 +23,4 @@ class B extends A {
 }
 ?>
 --EXPECTF--
-Warning: Declaration of B::foo($var) should be compatible with A::foo() in %sbug62358.php on line %d
+Fatal error: Declaration of B::foo($var) must be compatible with I::foo() in %sbug62358.php on line 17
index 22283003dfb0de348e09a2e7ff0b51c43266fd47..11ff72df18e658551eb4527830b0b225523232b6 100644 (file)
@@ -18,4 +18,4 @@ $test = new Foo();
 var_dump($test instanceof Baz);
 ?>
 --EXPECTF--
-Fatal error: Access level to Bar::bad() must be public (as in class Baz) in %sbug69467.php on line %d
+Fatal error: Access level to Foo::bad() must be public (as in class Baz) in %sbug69467.php on line %d
index 979eced1fb274152f1aedc93a92369621c60833d..8f01e72c2d6391f219471e0bf87bbbf4e32377ab 100644 (file)
@@ -16,4 +16,4 @@ class C implements IFoo {
 }
 
 --EXPECTF--
-Fatal error: Declaration of TFoo::oneArgument() must be compatible with IFoo::oneArgument($a) in %s on line %d
+Fatal error: Declaration of C::oneArgument() must be compatible with IFoo::oneArgument($a) in %s on line %d
index 24fffc9bc82d93e00e62c2867af0edd4f75157b6..bc33e07d1fa034effd990dcbc6fab875fbce7acd 100644 (file)
@@ -5311,10 +5311,6 @@ void zend_compile_class_decl(zend_ast *ast) /* {{{ */
 
        CG(active_class_entry) = ce;
 
-       if (implements_ast) {
-               zend_compile_implements(&declare_node, implements_ast);
-       }
-
        zend_compile_stmt(stmt_ast);
 
        /* Reset lineno for final opcodes and errors */
@@ -5371,11 +5367,15 @@ void zend_compile_class_decl(zend_ast *ast) /* {{{ */
                zend_emit_op(NULL, ZEND_BIND_TRAITS, &declare_node, NULL);
        }
 
+       if (implements_ast) {
+               zend_compile_implements(&declare_node, implements_ast);
+       }
+
        if (!(ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS))
-               && (extends_ast || ce->num_interfaces > 0)
+               && (extends_ast || implements_ast)
        ) {
                zend_verify_abstract_class(ce);
-               if (ce->num_interfaces && !(ce->ce_flags & ZEND_ACC_IMPLEMENT_TRAITS)) {
+               if (implements_ast) {
                        zend_emit_op(NULL, ZEND_VERIFY_ABSTRACT_CLASS, &declare_node, NULL);
                }
        }