Skip to content

Commit 4939e59

Browse files
committed
Merge branch 'PHP-8.5'
2 parents 71d27d8 + 15cbd82 commit 4939e59

3 files changed

Lines changed: 63 additions & 6 deletions

File tree

Zend/zend_vm_def.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4491,7 +4491,7 @@ ZEND_VM_COLD_CONST_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV
44914491
ZVAL_DEREF(retval_ptr);
44924492
}
44934493

4494-
if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
4494+
if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ref)))) {
44954495
ZEND_VM_NEXT_OPCODE();
44964496
}
44974497

@@ -4520,6 +4520,9 @@ ZEND_VM_COLD_CONST_HANDLER(124, ZEND_VERIFY_RETURN_TYPE, CONST|TMP|VAR|UNUSED|CV
45204520
}
45214521
retval_ptr = retval_ref;
45224522
}
4523+
if (EXPECTED(ZEND_TYPE_CONTAINS_CODE(ret_info->type, Z_TYPE_P(retval_ptr)))) {
4524+
ZEND_VM_NEXT_OPCODE();
4525+
}
45234526
}
45244527

45254528
SAVE_OPLINE();

Zend/zend_vm_execute.h

Lines changed: 20 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ext/opcache/tests/opt/gh21972.phpt

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
--TEST--
2+
GH-21972: Typed by-value return must not leak reference wrapper
3+
--INI--
4+
opcache.enable=1
5+
opcache.enable_cli=1
6+
opcache.optimization_level=-1
7+
--EXTENSIONS--
8+
opcache
9+
--FILE--
10+
<?php
11+
declare(strict_types=1);
12+
13+
enum ValueType {
14+
case BOOL;
15+
case MIXED;
16+
}
17+
18+
function applyDefinition(
19+
bool &$lazy = false,
20+
ValueType &$type = ValueType::MIXED,
21+
int &$flags = 0,
22+
?string &$default = null,
23+
): void {
24+
}
25+
26+
function getTypedValue(string $default, bool $lazy, ValueType $type): string {
27+
applyDefinition($lazy, $type, default: $default);
28+
return $default;
29+
}
30+
31+
$value = getTypedValue('false', false, ValueType::BOOL);
32+
var_dump(gettype($value));
33+
var_dump(strtolower($value));
34+
var_dump(strtolower(getTypedValue('FALSE', false, ValueType::BOOL)));
35+
?>
36+
--EXPECT--
37+
string(6) "string"
38+
string(5) "false"
39+
string(5) "false"

0 commit comments

Comments
 (0)