1--TEST--
2Nullsafe basic optimization
3--INI--
4opcache.enable=1
5opcache.enable_cli=1
6opcache.opt_debug_level=0x20000
7zend_test.observer.enabled=0
8--EXTENSIONS--
9opcache
10--FILE--
11<?php
12
13function test() {
14    $null = null;
15    var_dump($null?->foo);
16    var_dump(isset($null?->foo));
17    var_dump(empty($null?->foo));
18}
19
20function test2(object $obj) {
21    // TODO: Optimize the JMP_NULL away.
22    var_dump($obj?->foo);
23    var_dump(isset($obj?->foo));
24    var_dump(empty($obj?->foo));
25}
26
27?>
28--EXPECTF--
29$_main:
30     ; (lines=1, args=0, vars=0, tmps=0)
31     ; (after optimizer)
32     ; %s
330000 RETURN int(1)
34
35test:
36     ; (lines=10, args=0, vars=0, tmps=0)
37     ; (after optimizer)
38     ; %s
390000 INIT_FCALL 1 %d string("var_dump")
400001 SEND_VAL null 1
410002 DO_ICALL
420003 INIT_FCALL 1 %d string("var_dump")
430004 SEND_VAL bool(false) 1
440005 DO_ICALL
450006 INIT_FCALL 1 %d string("var_dump")
460007 SEND_VAL bool(true) 1
470008 DO_ICALL
480009 RETURN null
49
50test2:
51     ; (lines=17, args=1, vars=1, tmps=1)
52     ; (after optimizer)
53     ; %s
540000 CV0($obj) = RECV 1
550001 INIT_FCALL 1 %d string("var_dump")
560002 T1 = JMP_NULL CV0($obj) 0004
570003 T1 = FETCH_OBJ_R CV0($obj) string("foo")
580004 SEND_VAL T1 1
590005 DO_ICALL
600006 INIT_FCALL 1 %d string("var_dump")
610007 T1 = JMP_NULL CV0($obj) 0009
620008 T1 = ISSET_ISEMPTY_PROP_OBJ (isset) CV0($obj) string("foo")
630009 SEND_VAL T1 1
640010 DO_ICALL
650011 INIT_FCALL 1 %d string("var_dump")
660012 T1 = JMP_NULL CV0($obj) 0014
670013 T1 = ISSET_ISEMPTY_PROP_OBJ (empty) CV0($obj) string("foo")
680014 SEND_VAL T1 1
690015 DO_ICALL
700016 RETURN null
71