]> granicus.if.org Git - php/commitdiff
Fix ?-> in encaps vars without braces
authorIlija Tovilo <ilija.tovilo@me.com>
Sun, 9 Aug 2020 17:24:44 +0000 (19:24 +0200)
committerIlija Tovilo <ilija.tovilo@me.com>
Tue, 11 Aug 2020 19:16:44 +0000 (21:16 +0200)
Closes GH-5966.

Zend/tests/nullsafe_operator/003.phpt
Zend/tests/nullsafe_operator/033.phpt [new file with mode: 0644]
Zend/zend_language_scanner.l

index b19c619eeb1692b267af2188bf2539a43d72d116..83c2863d1a10cb1404b958167e25613acf8c3e2d 100644 (file)
@@ -19,25 +19,20 @@ var_dump(null?->baz);
 var_dump(null?->qux());
 var_dump(null?->quux());
 
-var_dump((new Foo)?->bar);
-var_dump((new Foo)?->baz);
-var_dump((new Foo)?->qux());
+var_dump($foo?->bar);
+var_dump($foo?->baz);
+var_dump($foo?->qux());
 try {
-    var_dump((new Foo)?->quux());
+    var_dump($foo?->quux());
 } catch (Throwable $e) {
     var_dump($e->getMessage());
 }
 
-var_dump("{$null?->foo}");
-var_dump("{$null?->bar}");
-var_dump("{$null?->qux()}");
-var_dump("{$null?->quux()}");
-
-var_dump("{$foo?->bar}");
-var_dump("{$foo?->baz}");
-var_dump("{$foo?->qux()}");
+var_dump((new Foo)?->bar);
+var_dump((new Foo)?->baz);
+var_dump((new Foo)?->qux());
 try {
-    var_dump("{$foo?->quux()}");
+    var_dump((new Foo)?->quux());
 } catch (Throwable $e) {
     var_dump($e->getMessage());
 }
@@ -54,13 +49,9 @@ Warning: Undefined property: Foo::$baz in %s.php on line 20
 NULL
 string(3) "qux"
 string(36) "Call to undefined method Foo::quux()"
-string(0) ""
-string(0) ""
-string(0) ""
-string(0) ""
 string(3) "bar"
 
-Warning: Undefined property: Foo::$baz in %s.php on line 34
-string(0) ""
+Warning: Undefined property: Foo::$baz in %s.php on line 29
+NULL
 string(3) "qux"
 string(36) "Call to undefined method Foo::quux()"
diff --git a/Zend/tests/nullsafe_operator/033.phpt b/Zend/tests/nullsafe_operator/033.phpt
new file mode 100644 (file)
index 0000000..63ee2f8
--- /dev/null
@@ -0,0 +1,61 @@
+--TEST--
+Test nullsafe operator in encaps vars
+--FILE--
+<?php
+
+class Foo {
+    public $bar = 'bar';
+
+    function qux() {
+        return 'qux';
+    }
+}
+
+$null = null;
+$foo = new Foo();
+
+var_dump("{$null?->foo}");
+var_dump("{$null?->bar()}");
+var_dump("$null?->foo");
+var_dump("$null?->bar()");
+
+var_dump("{$foo?->bar}");
+var_dump("{$foo?->baz}");
+var_dump("{$foo?->qux()}");
+try {
+    var_dump("{$foo?->quux()}");
+} catch (Throwable $e) {
+    var_dump($e->getMessage());
+}
+
+var_dump("$foo?->bar");
+var_dump("$foo?->baz");
+var_dump("$foo?->qux()");
+try {
+    var_dump("$foo?->quux()");
+} catch (Throwable $e) {
+    var_dump($e->getMessage());
+}
+
+?>
+--EXPECTF--
+string(0) ""
+string(0) ""
+string(0) ""
+string(2) "()"
+string(3) "bar"
+
+Warning: Undefined property: Foo::$baz in %s.php on line 20
+string(0) ""
+string(3) "qux"
+string(36) "Call to undefined method Foo::quux()"
+string(3) "bar"
+
+Warning: Undefined property: Foo::$baz in %s.php on line 29
+string(0) ""
+
+Warning: Undefined property: Foo::$qux in %s.php on line 30
+string(2) "()"
+
+Warning: Undefined property: Foo::$quux in %s.php on line 32
+string(2) "()"
index c98c0f8e9bdf28697222c94bfd02e6e1ef1c497c..deee3ae3cf75914e5cb17ca11c2331d7bfe752d3 100644 (file)
@@ -2257,8 +2257,8 @@ inline_char_handler:
 }
 
 
-/* Make sure a label character follows "->", otherwise there is no property
- * and "->" will be taken literally
+/* Make sure a label character follows "->" or "?->", otherwise there is no property
+ * and "->"/"?->" will be taken literally
  */
 <ST_DOUBLE_QUOTES,ST_HEREDOC,ST_BACKQUOTE>"$"{LABEL}"->"[a-zA-Z_\x80-\xff] {
        yyless(yyleng - 3);
@@ -2266,6 +2266,12 @@ inline_char_handler:
        RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
 }
 
+<ST_DOUBLE_QUOTES,ST_HEREDOC,ST_BACKQUOTE>"$"{LABEL}"?->"[a-zA-Z_\x80-\xff] {
+       yyless(yyleng - 4);
+       yy_push_state(ST_LOOKING_FOR_PROPERTY);
+       RETURN_TOKEN_WITH_STR(T_VARIABLE, 1);
+}
+
 /* A [ always designates a variable offset, regardless of what follows
  */
 <ST_DOUBLE_QUOTES,ST_HEREDOC,ST_BACKQUOTE>"$"{LABEL}"[" {