]> granicus.if.org Git - php/commitdiff
Fix #76700 - Methods with altered visibility need to be added again
authorPedro Magalhães <mail@pmmaga.net>
Fri, 3 Aug 2018 16:30:03 +0000 (17:30 +0100)
committerPedro Magalhães <mail@pmmaga.net>
Fri, 3 Aug 2018 16:30:03 +0000 (17:30 +0100)
Zend/tests/traits/bug76700.phpt [new file with mode: 0644]
Zend/zend_inheritance.c

diff --git a/Zend/tests/traits/bug76700.phpt b/Zend/tests/traits/bug76700.phpt
new file mode 100644 (file)
index 0000000..5b746d5
--- /dev/null
@@ -0,0 +1,31 @@
+--TEST--
+Bug #76700 (false-positive "Error: Call to protected method" when using trait aliases)
+--FILE--
+<?php
+trait T1
+{
+    protected function aa() { echo 123; }
+}
+
+trait T2
+{
+    use T1 {
+        aa as public;
+    }
+}
+
+class A
+{
+    use T1;
+}
+
+class B extends A
+{
+    use T2;
+}
+
+$b = new B();
+$b->aa();
+
+--EXPECT--
+123
index dc55410b66439f8a2444e6faff5eda7dfd7a1ea8..8af409f1919e2a5463f603059d32d7331123e03b 100644 (file)
@@ -1178,8 +1178,10 @@ static void zend_add_trait_method(zend_class_entry *ce, const char *name, zend_s
        zend_function *new_fn;
 
        if ((existing_fn = zend_hash_find_ptr(&ce->function_table, key)) != NULL) {
-               /* if it is the same function regardless of where it is coming from, there is no conflict and we do not need to add it again */
-               if (existing_fn->op_array.opcodes == fn->op_array.opcodes) {
+               /* if it is the same function with the same visibility regardless of where it is coming from */
+               /* there is no conflict and we do not need to add it again */
+               if (existing_fn->op_array.opcodes == fn->op_array.opcodes &&
+                       (existing_fn->common.fn_flags & ZEND_ACC_PPP_MASK) == (fn->common.fn_flags & ZEND_ACC_PPP_MASK)) {
                        return;
                }