From 10f660f0a51812ac62e8f03895944e895e553240 Mon Sep 17 00:00:00 2001 From: Ilija Tovilo Date: Sun, 9 Aug 2020 19:24:44 +0200 Subject: [PATCH] Fix ?-> in encaps vars without braces Closes GH-5966. --- Zend/tests/nullsafe_operator/003.phpt | 29 +++++-------- Zend/tests/nullsafe_operator/033.phpt | 61 +++++++++++++++++++++++++++ Zend/zend_language_scanner.l | 10 ++++- 3 files changed, 79 insertions(+), 21 deletions(-) create mode 100644 Zend/tests/nullsafe_operator/033.phpt diff --git a/Zend/tests/nullsafe_operator/003.phpt b/Zend/tests/nullsafe_operator/003.phpt index b19c619eeb..83c2863d1a 100644 --- a/Zend/tests/nullsafe_operator/003.phpt +++ b/Zend/tests/nullsafe_operator/003.phpt @@ -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 index 0000000000..63ee2f850a --- /dev/null +++ b/Zend/tests/nullsafe_operator/033.phpt @@ -0,0 +1,61 @@ +--TEST-- +Test nullsafe operator in encaps vars +--FILE-- +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) "()" diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l index c98c0f8e9b..deee3ae3cf 100644 --- a/Zend/zend_language_scanner.l +++ b/Zend/zend_language_scanner.l @@ -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 */ "$"{LABEL}"->"[a-zA-Z_\x80-\xff] { yyless(yyleng - 3); @@ -2266,6 +2266,12 @@ inline_char_handler: RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } +"$"{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 */ "$"{LABEL}"[" { -- 2.40.0