1--TEST--
2Nullsafe basic optimization
3--INI--
4opcache.enable=1
5opcache.enable_cli=1
6opcache.opt_debug_level=0x20000
7--SKIPIF--
8<?php require_once(__DIR__ . '/../skipif.inc'); ?>
9--FILE--
10<?php
11
12function test() {
13    $null = null;
14    var_dump($null?->foo);
15    var_dump(isset($null?->foo));
16    var_dump(empty($null?->foo));
17}
18
19function test2(object $obj) {
20    // TODO: Optimize the JMP_NULL away.
21    var_dump($obj?->foo);
22    var_dump(isset($obj?->foo));
23    var_dump(empty($obj?->foo));
24}
25
26?>
27--EXPECTF--
28$_main:
29     ; (lines=1, args=0, vars=0, tmps=0)
30     ; (after optimizer)
31     ; %s
320000 RETURN int(1)
33
34test:
35     ; (lines=10, args=0, vars=0, tmps=0)
36     ; (after optimizer)
37     ; %s
380000 INIT_FCALL 1 %d string("var_dump")
390001 SEND_VAL null 1
400002 DO_ICALL
410003 INIT_FCALL 1 %d string("var_dump")
420004 SEND_VAL bool(false) 1
430005 DO_ICALL
440006 INIT_FCALL 1 %d string("var_dump")
450007 SEND_VAL bool(true) 1
460008 DO_ICALL
470009 RETURN null
48
49test2:
50     ; (lines=17, args=1, vars=1, tmps=1)
51     ; (after optimizer)
52     ; %s
530000 CV0($obj) = RECV 1
540001 INIT_FCALL 1 %d string("var_dump")
550002 T1 = JMP_NULL CV0($obj) 0004
560003 T1 = FETCH_OBJ_R CV0($obj) string("foo")
570004 SEND_VAL T1 1
580005 DO_ICALL
590006 INIT_FCALL 1 %d string("var_dump")
600007 T1 = JMP_NULL CV0($obj) 0009
610008 T1 = ISSET_ISEMPTY_PROP_OBJ (isset) CV0($obj) string("foo")
620009 SEND_VAL T1 1
630010 DO_ICALL
640011 INIT_FCALL 1 %d string("var_dump")
650012 T1 = JMP_NULL CV0($obj) 0014
660013 T1 = ISSET_ISEMPTY_PROP_OBJ (empty) CV0($obj) string("foo")
670014 SEND_VAL T1 1
680015 DO_ICALL
690016 RETURN null
70