Commit:    e62bb0325763d9847847dd198e05c9b3147caf05
Author:    Dmitry Stogov <dmi...@zend.com>         Tue, 19 Mar 2013 12:48:23 
+0400
Parents:   e25b2d7ea5a2699fb32b467aae9e3a0fda2ba0db
Branches:  PHP-5.4 PHP-5.5 master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=e62bb0325763d9847847dd198e05c9b3147caf05

Log:
Fixed bug #64417 (ArrayAccess::&offsetGet() in a trait causes fatal error)

Bugs:
https://bugs.php.net/64417

Changed paths:
  M  NEWS
  A  Zend/tests/bug64417.phpt
  M  Zend/zend_compile.c


Diff:
diff --git a/NEWS b/NEWS
index fd05e22..75b588b 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,8 @@ PHP                                                             
           NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? ??? 2013, PHP 5.4.14
 - Core
+  . Fixed bug #64417 (ArrayAccess::&offsetGet() in a trait causes fatal error).
+    (Dmitry)
   . Fixed bug #64370 (microtime(true) less than 
$_SERVER['REQUEST_TIME_FLOAT']).
     (Anatol)
 
diff --git a/Zend/tests/bug64417.phpt b/Zend/tests/bug64417.phpt
new file mode 100644
index 0000000..f3ef740
--- /dev/null
+++ b/Zend/tests/bug64417.phpt
@@ -0,0 +1,39 @@
+--TEST--
+Bug #64417 (BC break: ArrayAccess::&offsetGet() in a trait causes fatal error)
+--FILE--
+<?php
+trait aa {
+    private $container = array();
+    public function offsetSet($offset, $value) {
+        if (is_null($offset)) {
+            $this->container[] = $value;
+        } else {
+            $this->container[$offset] = $value;
+        }
+    }
+    public function offsetExists($offset) {
+        return isset($this->container[$offset]);
+    }
+    public function offsetUnset($offset) {
+        unset($this->container[$offset]);
+    }
+    public function &offsetGet($offset) {
+       $result = null;
+        if (isset($this->container[$offset])) {
+            $result = &$this->container[$offset];
+        }
+        return $result;
+    }
+}
+
+class obj implements ArrayAccess {
+    use aa;
+}
+
+$o = new obj;
+$o['x'] = 1;
+++$o['x'];
+echo $o['x'], "\n";
+--EXPECT--
+2
+
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 0a1749d..766a2de 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -3634,7 +3634,7 @@ static zend_bool 
zend_traits_method_compatibility_check(zend_function *fn, zend_
        zend_uint other_flags = other_fn->common.scope->ce_flags;
        
        return zend_do_perform_implementation_check(fn, other_fn TSRMLS_CC)
-               && zend_do_perform_implementation_check(other_fn, fn TSRMLS_CC)
+               && ((other_fn->common.scope->ce_flags & ZEND_ACC_INTERFACE) || 
zend_do_perform_implementation_check(other_fn, fn TSRMLS_CC))
                && ((fn_flags & (ZEND_ACC_FINAL|ZEND_ACC_STATIC)) == 
                    (other_flags & (ZEND_ACC_FINAL|ZEND_ACC_STATIC))); /* equal 
final and static qualifier */
 }


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to