diff options
author | Pedro Magalhães <mail@pmmaga.net> | 2018-08-03 17:30:03 +0100 |
---|---|---|
committer | Xinchen Hui <laruence@gmail.com> | 2018-08-07 14:22:37 +0800 |
commit | 887235773d1848108f842184c978ba37875768f2 (patch) | |
tree | 97050354deb5fb89d35cddf8eee13fca311f672f | |
parent | 2b1d79ce6661efdfae881884ca40b4ca7fc991e7 (diff) | |
download | php-git-887235773d1848108f842184c978ba37875768f2.tar.gz |
Fix #76700 - Methods with altered visibility need to be added again
-rw-r--r-- | Zend/tests/traits/bug76700.phpt | 31 | ||||
-rw-r--r-- | Zend/zend_inheritance.c | 6 |
2 files changed, 35 insertions, 2 deletions
diff --git a/Zend/tests/traits/bug76700.phpt b/Zend/tests/traits/bug76700.phpt new file mode 100644 index 0000000000..5b746d5671 --- /dev/null +++ b/Zend/tests/traits/bug76700.phpt @@ -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 diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index dc55410b66..8af409f191 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -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; } |