]> granicus.if.org Git - php/commitdiff
Fix arrow operator precedence
authorNikita Popov <nikic@php.net>
Sun, 7 Dec 2014 21:58:14 +0000 (22:58 +0100)
committerNikita Popov <nikic@php.net>
Sun, 7 Dec 2014 22:00:48 +0000 (23:00 +0100)
I accidentially added => as the highest-precedence operator...

Zend/tests/generators/yield_precedence.phpt [new file with mode: 0644]
Zend/zend_language_parser.y

diff --git a/Zend/tests/generators/yield_precedence.phpt b/Zend/tests/generators/yield_precedence.phpt
new file mode 100644 (file)
index 0000000..6b87fa0
--- /dev/null
@@ -0,0 +1,51 @@
+--TEST--
+Precedence of yield and arrow operators
+--FILE--
+<?php
+
+function gen() {
+    yield "a" . "b";
+    yield "a" or die;
+    yield "k" => "a" . "b";
+    yield "k" => "a" or die;
+    var_dump([yield "k" => "a" . "b"]);
+    yield yield "k1" => yield "k2" => "a" . "b";
+    yield yield "k1" => (yield "k2") => "a" . "b";
+    var_dump([yield "k1" => yield "k2" => "a" . "b"]);
+    var_dump([yield "k1" => (yield "k2") => "a" . "b"]);
+}
+
+$g = gen();
+for ($g->rewind(), $i = 1; $g->valid(); $g->send($i), $i++) {
+    echo "{$g->key()} => {$g->current()}\n";
+}
+
+?>
+--EXPECT--
+0 => ab
+1 => a
+k => ab
+k => a
+k => ab
+array(1) {
+  [0]=>
+  int(5)
+}
+k2 => ab
+k1 => 6
+2 => 7
+3 => k2
+k1 => 9
+10 => ab
+k2 => ab
+k1 => 12
+array(1) {
+  [0]=>
+  int(13)
+}
+11 => k2
+k1 => 14
+array(1) {
+  [15]=>
+  string(2) "ab"
+}
index 88286203da95396265869a160935da3bc4ac7ed2..94734defe2203ffcf573cfba7c5a5a53fa5ea407 100644 (file)
@@ -70,6 +70,7 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
 %left T_LOGICAL_AND
 %right T_PRINT
 %right T_YIELD
+%right T_DOUBLE_ARROW
 %left '=' T_PLUS_EQUAL T_MINUS_EQUAL T_MUL_EQUAL T_DIV_EQUAL T_CONCAT_EQUAL T_MOD_EQUAL T_AND_EQUAL T_OR_EQUAL T_XOR_EQUAL T_SL_EQUAL T_SR_EQUAL T_POW_EQUAL
 %left '?' ':'
 %right T_COALESCE
@@ -93,7 +94,6 @@ static YYSIZE_T zend_yytnamerr(char*, const char*);
 %left T_ELSE 
 %left T_ENDIF 
 %right T_STATIC T_ABSTRACT T_FINAL T_PRIVATE T_PROTECTED T_PUBLIC
-%right T_DOUBLE_ARROW
 
 %token <ast> T_LNUMBER   "integer number (T_LNUMBER)"
 %token <ast> T_DNUMBER   "floating-point number (T_DNUMBER)"