@@ -7747,13 +7747,28 @@ static void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32
77477747 zval_ptr_dtor (& default_node .u .constant );
77487748 }
77497749
7750- opline = zend_emit_op (NULL , opcode , NULL , & default_node );
7751- SET_NODE (opline -> result , & var_node );
7752- opline -> op1 .num = i + 1 ;
7753-
77547750 uint32_t arg_info_flags = _ZEND_ARG_INFO_FLAGS (is_ref , is_variadic , /* is_tentative */ 0 )
77557751 | (is_promoted ? _ZEND_IS_PROMOTED_BIT : 0 );
77567752 ZEND_TYPE_FULL_MASK (arg_info -> type ) |= arg_info_flags ;
7753+
7754+ if (opcode == ZEND_RECV
7755+ && type_ast
7756+ && ZEND_TYPE_IS_COMPLEX (arg_info -> type )
7757+ && !ZEND_TYPE_HAS_LIST (arg_info -> type )
7758+ && ZEND_TYPE_HAS_NAME (arg_info -> type )
7759+ && !ZEND_TYPE_HAS_LITERAL_NAME (arg_info -> type ) // TODO: necessary?
7760+ && ZEND_TYPE_PURE_MASK (arg_info -> type ) == 0 ) {
7761+ znode ce_name ;
7762+ ce_name .op_type = IS_CONST ;
7763+ ZVAL_STR_COPY (& ce_name .u .constant , ZEND_TYPE_NAME (arg_info -> type ));
7764+ opcode = ZEND_RECV_CE ;
7765+ opline = zend_emit_op (NULL , opcode , NULL , & ce_name );
7766+ } else {
7767+ opline = zend_emit_op (NULL , opcode , NULL , & default_node );
7768+ }
7769+ SET_NODE (opline -> result , & var_node );
7770+ opline -> op1 .num = i + 1 ;
7771+
77577772 if (opcode == ZEND_RECV ) {
77587773 opline -> op2 .num = type_ast ?
77597774 ZEND_TYPE_FULL_MASK (arg_info -> type ) : MAY_BE_ANY ;
0 commit comments