Commit 3554f524a56 for php
commit 3554f524a56cf2f8fb39b77fc3113a14de5a76cf
Author: Jorg Sowa <jorg.sowa@gmail.com>
Date: Thu Nov 12 13:26:40 2026 +0100
Fix AST export of by-reference property hooks (GH-25069)
ZEND_ACC_RETURN_REFERENCE shares a bit with ZEND_ACC_PRIVATE_SET, so &get
was exported as private(set) get.
Closes GH-25069
diff --git a/NEWS b/NEWS
index e8051495b75..f8f42260fd1 100644
--- a/NEWS
+++ b/NEWS
@@ -25,6 +25,7 @@ PHP NEWS
(Jorg Sowa)
. Fixed bug GH-25311 (Assertion ret == SUCCESS in array_map()/array_filter()
after delayed out-of-memory). (ndossche)
+ . Fixed AST export of by-reference property hooks. (Jorg Sowa)
- Curl:
. Fixed curl_reset() retaining CURLOPT_PRIVATE after reset. (lacatoire)
diff --git a/Zend/tests/property_hooks/ast_printing_by_ref.phpt b/Zend/tests/property_hooks/ast_printing_by_ref.phpt
new file mode 100644
index 00000000000..a3b0bd405f7
--- /dev/null
+++ b/Zend/tests/property_hooks/ast_printing_by_ref.phpt
@@ -0,0 +1,34 @@
+--TEST--
+By-reference hook AST printing
+--FILE--
+<?php
+
+try {
+ assert(false && new class {
+ public $prop1 { &get => $this->prop1; }
+ public $prop2 {
+ final &get {
+ return $this->prop2;
+ }
+ }
+ public private(set) int $prop3 { &get => $this->prop3; }
+ });
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
+
+?>
+--EXPECT--
+assert(false && new class {
+ public $prop1 {
+ &get => $this->prop1;
+ }
+ public $prop2 {
+ final &get {
+ return $this->prop2;
+ }
+ }
+ public private(set) int $prop3 {
+ &get => $this->prop3;
+ }
+})
diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c
index 0f20becf045..062983769a6 100644
--- a/Zend/zend_ast.c
+++ b/Zend/zend_ast.c
@@ -1788,10 +1788,12 @@ static ZEND_COLD void zend_ast_export_hook_list(smart_str *str, zend_ast_list *h
for (uint32_t i = 0; i < hook_list->children; i++) {
zend_ast_decl *hook = (zend_ast_decl *)hook_list->child[i];
- zend_ast_export_visibility(str, hook->flags, ZEND_MODIFIER_TARGET_PROPERTY);
if (hook->flags & ZEND_ACC_FINAL) {
smart_str_appends(str, "final ");
}
+ if (hook->flags & ZEND_ACC_RETURN_REFERENCE) {
+ smart_str_appendc(str, '&');
+ }
smart_str_append(str, hook->name);
zend_ast *body = hook->child[2];
if (body == NULL) {