]> granicus.if.org Git - php/commitdiff
Added missing consistency check for abstract methods required by one trait and implem...
authorStefan Marr <gron@php.net>
Tue, 1 Nov 2011 13:42:53 +0000 (13:42 +0000)
committerStefan Marr <gron@php.net>
Tue, 1 Nov 2011 13:42:53 +0000 (13:42 +0000)
Zend/tests/traits/bugs/abstract-methods05.phpt [new file with mode: 0644]
Zend/tests/traits/bugs/abstract-methods06.phpt [new file with mode: 0644]
Zend/zend_compile.c

diff --git a/Zend/tests/traits/bugs/abstract-methods05.phpt b/Zend/tests/traits/bugs/abstract-methods05.phpt
new file mode 100644 (file)
index 0000000..e90ce39
--- /dev/null
@@ -0,0 +1,25 @@
+--TEST--
+The compatibility with the signature of abstract methods should be checked.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait THelloB {
+  public function hello() {
+       echo 'Hello';
+  }
+}
+
+trait THelloA {
+  public abstract function hello($a);
+}
+
+class TraitsTest1 {
+       use THelloB;
+       use THelloA;  
+}
+
+
+?>
+--EXPECTF--    
+Fatal error: Declaration of THelloB::hello() must be compatible with THelloA::hello($a) in %s on line %d
\ No newline at end of file
diff --git a/Zend/tests/traits/bugs/abstract-methods06.phpt b/Zend/tests/traits/bugs/abstract-methods06.phpt
new file mode 100644 (file)
index 0000000..fdcd816
--- /dev/null
@@ -0,0 +1,26 @@
+--TEST--
+The compatibility with the signature of abstract methods should be checked. (also checking the second possible implementation branch)
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait THelloB {
+  public function hello() {
+    echo 'Hello';
+  }  
+}
+
+trait THelloA {
+  public abstract function hello($a);
+}
+
+class TraitsTest1 {
+       use THelloA;
+       use THelloB;
+}
+
+
+
+?>
+--EXPECTF--    
+Fatal error: Declaration of THelloB::hello() must be compatible with THelloA::hello($a) in %s on line %d
\ No newline at end of file
index bf8a35d3ed96ba6cbf955fff9db4be376d0408f5..cb79e34bed2bcbb42f7b7e8902608ebc8276d371 100644 (file)
@@ -3616,6 +3616,9 @@ static int zend_traits_merge_functions(zend_function *fn TSRMLS_DC, int num_args
                if (zend_hash_quick_find(function_tables[i], hash_key->arKey, hash_key->nKeyLength, hash_key->h, (void **)&other_trait_fn) == SUCCESS) {
                        /* if it is an abstract method, there is no collision */
                        if (other_trait_fn->common.fn_flags & ZEND_ACC_ABSTRACT) {
+                               /* Make sure they are compatible */
+                               do_inheritance_check_on_method(fn, other_trait_fn TSRMLS_CC);
+                               
                                /* we can savely free and remove it from other table */
                                zend_function_dtor(other_trait_fn);
                                zend_hash_quick_del(function_tables[i], hash_key->arKey, hash_key->nKeyLength, hash_key->h);
@@ -3623,6 +3626,9 @@ static int zend_traits_merge_functions(zend_function *fn TSRMLS_DC, int num_args
                                /* if it is not an abstract method, there is still no collision */
                                /* if fn is an abstract method */
                                if (fn->common.fn_flags & ZEND_ACC_ABSTRACT) {
+                                       /* Make sure they are compatible */
+                                       do_inheritance_check_on_method(other_trait_fn, fn TSRMLS_CC);
+                                       
                                        /* just mark as solved, will be added if its own trait is processed */
                                        abstract_solved = 1;
                                } else {