@@ -7721,13 +7721,28 @@ static void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast, uint32
77217721 zval_ptr_dtor (& default_node .u .constant );
77227722 }
77237723
7724- opline = zend_emit_op (NULL , opcode , NULL , & default_node );
7725- SET_NODE (opline -> result , & var_node );
7726- opline -> op1 .num = i + 1 ;
7727-
77287724 uint32_t arg_info_flags = _ZEND_ARG_INFO_FLAGS (is_ref , is_variadic , /* is_tentative */ 0 )
77297725 | (is_promoted ? _ZEND_IS_PROMOTED_BIT : 0 );
77307726 ZEND_TYPE_FULL_MASK (arg_info -> type ) |= arg_info_flags ;
7727+
7728+ if (opcode == ZEND_RECV
7729+ && type_ast
7730+ && ZEND_TYPE_IS_COMPLEX (arg_info -> type )
7731+ && !ZEND_TYPE_HAS_LIST (arg_info -> type )
7732+ && ZEND_TYPE_HAS_NAME (arg_info -> type )
7733+ && !ZEND_TYPE_HAS_LITERAL_NAME (arg_info -> type ) // TODO: necessary?
7734+ && ZEND_TYPE_PURE_MASK (arg_info -> type ) == 0 ) {
7735+ znode ce_name ;
7736+ ce_name .op_type = IS_CONST ;
7737+ ZVAL_STR_COPY (& ce_name .u .constant , ZEND_TYPE_NAME (arg_info -> type ));
7738+ opcode = ZEND_RECV_CE ;
7739+ opline = zend_emit_op (NULL , opcode , NULL , & ce_name );
7740+ } else {
7741+ opline = zend_emit_op (NULL , opcode , NULL , & default_node );
7742+ }
7743+ SET_NODE (opline -> result , & var_node );
7744+ opline -> op1 .num = i + 1 ;
7745+
77317746 if (opcode == ZEND_RECV ) {
77327747 opline -> op2 .num = type_ast ?
77337748 ZEND_TYPE_FULL_MASK (arg_info -> type ) : MAY_BE_ANY ;
0 commit comments