summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@php.net>2015-04-21 22:36:32 +0800
committerXinchen Hui <laruence@php.net>2015-04-21 22:36:32 +0800
commitc667c26f616f91db5b890d39807c77c4720ba507 (patch)
tree7979a6b796a0f27f75b84f36db03b7e26341f505
parent35baf7146656c7262914f0059a3a585ae51bb82a (diff)
downloadphp-git-c667c26f616f91db5b890d39807c77c4720ba507.tar.gz
Fixed Bug #69467 (Wrong checked for the interface by using Trait)
-rw-r--r--NEWS2
-rw-r--r--Zend/tests/bug69467.phpt21
-rw-r--r--Zend/zend_compile.c5
3 files changed, 26 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 10a598a8aa..a094c5a4e3 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,8 @@ PHP NEWS
?? ??? 2015, PHP 5.5.25
- Core:
+ . Fixed bug #69467 (Wrong checked for the interface by using Trait).
+ (Laruence)
. Fixed bug #69420 (Invalid read in zend_std_get_method). (Laruence)
. Fixed bug #60022 ("use statement [...] has no effect" depends on leading
backslash). (Nikita)
diff --git a/Zend/tests/bug69467.phpt b/Zend/tests/bug69467.phpt
new file mode 100644
index 0000000000..22283003df
--- /dev/null
+++ b/Zend/tests/bug69467.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Bug #69467 (Wrong checked for the interface by using Trait)
+--FILE--
+<?php
+interface Baz {
+ public function bad();
+}
+
+trait Bar{
+ protected function bad(){}
+}
+
+class Foo implements Baz{
+ use Bar;
+}
+
+$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
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 4e61f5fd22..719f6e7de2 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -3912,14 +3912,15 @@ static void zend_add_trait_method(zend_class_entry *ce, const char *name, const
}
zend_hash_quick_update(*overriden, arKey, nKeyLength, h, fn, sizeof(zend_function), (void**)&fn);
return;
- } else if (existing_fn->common.fn_flags & ZEND_ACC_ABSTRACT) {
+ } else if (existing_fn->common.fn_flags & ZEND_ACC_ABSTRACT &&
+ (existing_fn->common.scope->ce_flags & ZEND_ACC_INTERFACE) == 0) {
/* Make sure the trait method is compatible with previosly declared abstract method */
if (!zend_traits_method_compatibility_check(fn, existing_fn TSRMLS_CC)) {
zend_error(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s",
zend_get_function_declaration(fn TSRMLS_CC),
zend_get_function_declaration(existing_fn TSRMLS_CC));
}
- } else if (fn->common.fn_flags & ZEND_ACC_ABSTRACT) {
+ } else if (fn->common.fn_flags & ZEND_ACC_ABSTRACT) {
/* Make sure the abstract declaration is compatible with previous declaration */
if (!zend_traits_method_compatibility_check(existing_fn, fn TSRMLS_CC)) {
zend_error(E_COMPILE_ERROR, "Declaration of %s must be compatible with %s",