gron                                     Tue, 01 Nov 2011 00:39:10 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=318625

Log:
Fixed Bug #60145 (Usage of trait's use statement inside interfaces not properly 
checked.)

Bug: https://bugs.php.net/60145 (Assigned) interface + use trait yields error 
for the abstract class?
      
Changed paths:
    A   php/php-src/branches/PHP_5_4/Zend/tests/traits/bug60145.phpt
    U   php/php-src/branches/PHP_5_4/Zend/zend_compile.c
    A   php/php-src/trunk/Zend/tests/traits/bug60145.phpt
    U   php/php-src/trunk/Zend/zend_compile.c

Added: php/php-src/branches/PHP_5_4/Zend/tests/traits/bug60145.phpt
===================================================================
--- php/php-src/branches/PHP_5_4/Zend/tests/traits/bug60145.phpt                
                (rev 0)
+++ php/php-src/branches/PHP_5_4/Zend/tests/traits/bug60145.phpt        
2011-11-01 00:39:10 UTC (rev 318625)
@@ -0,0 +1,17 @@
+--TEST--
+Bug #60145 (Usage of trait's use statement inside interfaces not properly 
checked.)
+--FILE--
+<?php
+
+trait foo {
+
+}
+
+interface MyInterface {
+       use foo;
+
+       public function b();
+
+}
+--EXPECTF--
+Fatal error: Cannot use traits inside of interfaces. foo is used in 
MyInterface in %s on line %d

Modified: php/php-src/branches/PHP_5_4/Zend/zend_compile.c
===================================================================
--- php/php-src/branches/PHP_5_4/Zend/zend_compile.c    2011-11-01 00:08:34 UTC 
(rev 318624)
+++ php/php-src/branches/PHP_5_4/Zend/zend_compile.c    2011-11-01 00:39:10 UTC 
(rev 318625)
@@ -5023,7 +5023,13 @@
 void zend_do_implements_trait(znode *trait_name TSRMLS_DC) /* {{{ */
 {
        zend_op *opline;
+  if ((CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE)) {
+    zend_error(E_COMPILE_ERROR,
+               "Cannot use traits inside of interfaces. %s is used in %s",
+               Z_STRVAL(trait_name->u.constant), CG(active_class_entry)->name);
+  }

+
        switch (zend_get_class_fetch_type(Z_STRVAL(trait_name->u.constant), 
Z_STRLEN(trait_name->u.constant))) {
                case ZEND_FETCH_CLASS_SELF:
                case ZEND_FETCH_CLASS_PARENT:

Added: php/php-src/trunk/Zend/tests/traits/bug60145.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/bug60145.phpt                           
(rev 0)
+++ php/php-src/trunk/Zend/tests/traits/bug60145.phpt   2011-11-01 00:39:10 UTC 
(rev 318625)
@@ -0,0 +1,17 @@
+--TEST--
+Bug #60145 (Usage of trait's use statement inside interfaces not properly 
checked.)
+--FILE--
+<?php
+
+trait foo {
+
+}
+
+interface MyInterface {
+       use foo;
+
+       public function b();
+
+}
+--EXPECTF--
+Fatal error: Cannot use traits inside of interfaces. foo is used in 
MyInterface in %s on line %d

Modified: php/php-src/trunk/Zend/zend_compile.c
===================================================================
--- php/php-src/trunk/Zend/zend_compile.c       2011-11-01 00:08:34 UTC (rev 
318624)
+++ php/php-src/trunk/Zend/zend_compile.c       2011-11-01 00:39:10 UTC (rev 
318625)
@@ -5023,7 +5023,13 @@
 void zend_do_implements_trait(znode *trait_name TSRMLS_DC) /* {{{ */
 {
        zend_op *opline;
+  if ((CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE)) {
+    zend_error(E_COMPILE_ERROR,
+               "Cannot use traits inside of interfaces. %s is used in %s",
+               Z_STRVAL(trait_name->u.constant), CG(active_class_entry)->name);
+  }

+
        switch (zend_get_class_fetch_type(Z_STRVAL(trait_name->u.constant), 
Z_STRLEN(trait_name->u.constant))) {
                case ZEND_FETCH_CLASS_SELF:
                case ZEND_FETCH_CLASS_PARENT:

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

Reply via email to