diff --git a/NEWS b/NEWS index 557fe0aea7f25..c0f20b747da2d 100644 --- a/NEWS +++ b/NEWS @@ -52,6 +52,7 @@ PHP NEWS . Fixed bugs GH-17711 and GH-18022 (Infinite recursion on deprecated attribute evaluation) and GH-18464 (Recursion protection for deprecation constants not released on bailout). (DanielEScherzer and ilutov) + . Fixed AST printing for immediately invoked Closure. (Dmitrii Derepko) - Curl: . Added curl_multi_get_handles(). (timwolla) diff --git a/Zend/tests/arrow_functions/007.phpt b/Zend/tests/arrow_functions/007.phpt index ec1e165fd680d..66b03b84c2e93 100644 --- a/Zend/tests/arrow_functions/007.phpt +++ b/Zend/tests/arrow_functions/007.phpt @@ -5,8 +5,6 @@ zend.assertions=1 --FILE-- false)()); } catch (AssertionError $e) { @@ -21,5 +19,5 @@ try { ?> --EXPECT-- -assert(): assert(fn() => false()) failed -assert(): assert(fn&(int ...$args): ?bool => $args[0](false)) failed +assert(): assert((fn() => false)()) failed +assert(): assert((fn&(int ...$args): ?bool => $args[0])(false)) failed diff --git a/Zend/tests/enum/ast-dumper.phpt b/Zend/tests/enum/ast-dumper.phpt index ed38e44e7c2f2..7972fe64965e2 100644 --- a/Zend/tests/enum/ast-dumper.phpt +++ b/Zend/tests/enum/ast-dumper.phpt @@ -28,7 +28,7 @@ try { ?> --EXPECT-- -assert(function () { +assert((function () { enum Foo { case Bar; } @@ -45,4 +45,4 @@ assert(function () { } return false; -}()) +})()) diff --git a/Zend/tests/functions/007.phpt b/Zend/tests/functions/007.phpt new file mode 100644 index 0000000000000..0d741546dc63b --- /dev/null +++ b/Zend/tests/functions/007.phpt @@ -0,0 +1,18 @@ +--TEST-- +Pretty printing for arrow functions +--INI-- +zend.assertions=1 +--FILE-- +getMessage(), ' failed', PHP_EOL; +} + +?> +--EXPECT-- +assert(): assert((function () { + return false; +})()) failed diff --git a/Zend/tests/match/009_ast_export.phpt b/Zend/tests/match/009_ast_export.phpt index 8dc89d4fe0672..9d95b722b2229 100644 --- a/Zend/tests/match/009_ast_export.phpt +++ b/Zend/tests/match/009_ast_export.phpt @@ -19,10 +19,10 @@ assert((function () { ?> --EXPECTF-- -assert(): assert(function () { +assert(): assert((function () { match ('foo') { 'foo', 'bar' => false, 'baz' => 'a', default => 'b', }; -}()) failed +})()) failed diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 8bdd29c5512cc..5104aad3510e0 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -2424,12 +2424,20 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio smart_str_appends(str, "::$"); zend_ast_export_var(str, ast->child[1], 0, indent); break; - case ZEND_AST_CALL: - zend_ast_export_ns_name(str, ast->child[0], 0, indent); + case ZEND_AST_CALL: { + zend_ast *left = ast->child[0]; + if (left->kind == ZEND_AST_ARROW_FUNC || left->kind == ZEND_AST_CLOSURE) { + smart_str_appends(str, "("); + zend_ast_export_ns_name(str, left, 0, indent); + smart_str_appends(str, ")"); + } else { + zend_ast_export_ns_name(str, left, 0, indent); + } smart_str_appendc(str, '('); zend_ast_export_ex(str, ast->child[1], 0, indent); smart_str_appendc(str, ')'); break; + } case ZEND_AST_PARENT_PROPERTY_HOOK_CALL: smart_str_append(str, Z_STR_P(zend_ast_get_zval(ast->child[0]))); smart_str_appendc(str, '(');