1--TEST--
2Bug #72663 (1): Don't call __destruct if __wakeup not called or fails
3--FILE--
4<?php
5
6#[AllowDynamicProperties]
7class Test1 {
8    public function __wakeup() {
9        echo "Wakeup\n";
10    }
11    public function __destruct() {
12        echo "Dtor\n";
13    }
14}
15
16#[AllowDynamicProperties]
17class Test2 {
18    public function __wakeup() {
19        throw new Exception('Unserialization forbidden');
20    }
21    public function __destruct() {
22        echo "Dtor\n";
23    }
24}
25
26// Unserialize object with error in properties
27$s = 'O:5:"Test1":1:{s:10:"";}';
28var_dump(unserialize($s));
29
30// Variation: Object is turned into a reference
31$s = 'O:5:"Test1":2:{i:0;R:1;s:10:"";}';
32var_dump(unserialize($s));
33
34// Unserialize object with throwing __wakeup
35$s = 'O:5:"Test2":0:{}';
36try {
37    var_dump(unserialize($s));
38} catch (Exception $e) {
39    echo "Caught\n";
40}
41//
42// Variation: Object is turned into a reference
43$s = 'O:5:"Test2":1:{i:0;R:1;}';
44try {
45    var_dump(unserialize($s));
46} catch (Exception $e) {
47    echo "Caught\n";
48}
49
50?>
51--EXPECTF--
52Notice: unserialize(): Error at offset 17 of 24 bytes in %s on line %d
53bool(false)
54
55Notice: unserialize(): Error at offset 25 of 32 bytes in %s on line %d
56bool(false)
57Caught
58Caught
59