From fdebad0b25bade683dc8e3e04128c876b86a877a Mon Sep 17 00:00:00 2001 From: Dmitrii Derepko Date: Thu, 29 May 2025 17:47:47 +0400 Subject: [PATCH] zend_ast: Add parentheses around IIFE in zend_ast_export() (#18688) --- NEWS | 1 + Zend/tests/arrow_functions/007.phpt | 6 ++---- Zend/tests/enum/ast-dumper.phpt | 4 ++-- Zend/tests/functions/007.phpt | 18 ++++++++++++++++++ Zend/tests/match/009_ast_export.phpt | 4 ++-- Zend/zend_ast.c | 12 ++++++++++-- 6 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 Zend/tests/functions/007.phpt diff --git a/NEWS b/NEWS index 557fe0aea7f..c0f20b747da 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 ec1e165fd68..66b03b84c2e 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 ed38e44e7c2..7972fe64965 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 00000000000..0d741546dc6 --- /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 8dc89d4fe06..9d95b722b22 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 8bdd29c5512..5104aad3510 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -2424,12 +2424,20 @@ simple_list: 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, '(');