--TEST--
Behavior of failing compound assignment
+--INI--
+opcache.optimization_level=0
--FILE--
<?php
$a = 1;
$a <<= -1;
} catch (Error $e) { var_dump($a); }
+
+set_error_handler(function() { throw new Exception; });
+
+try {
+ $a = [];
+ $a .= "foo";
+} catch (Throwable $e) { var_dump($a); }
+
+try {
+ $a = "foo";
+ $a .= [];
+} catch (Throwable $e) { var_dump($a); }
?>
--EXPECT--
int(1)
int(1)
int(1)
+array(0) {
+}
+string(3) "foo"
ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_CONCAT, concat_function);
use_copy1 = zend_make_printable_zval(op1, &op1_copy);
if (use_copy1) {
+ if (UNEXPECTED(EG(exception))) {
+ zval_dtor(&op1_copy);
+ return FAILURE;
+ }
if (result == op1) {
if (UNEXPECTED(op1 == op2)) {
op2 = &op1_copy;
ZEND_TRY_BINARY_OP2_OBJECT_OPERATION(ZEND_CONCAT);
use_copy2 = zend_make_printable_zval(op2, &op2_copy);
if (use_copy2) {
+ if (UNEXPECTED(EG(exception))) {
+ if (UNEXPECTED(use_copy1)) {
+ zval_dtor(op1);
+ }
+ zval_dtor(&op2_copy);
+ return FAILURE;
+ }
op2 = &op2_copy;
}
}