@@ -206,7 +206,6 @@ impl GenericSpecialFnClone {
206206
207207 AstNode :: MacroSizeof ( target_type) => AstNode :: MacroSizeof ( target_type. clone ( ) ) ,
208208 AstNode :: MacroDefault ( target_type) => AstNode :: MacroDefault ( target_type. clone ( ) ) ,
209- AstNode :: MacroUla ( src) => AstNode :: MacroUla ( Box :: new ( self . clone_expr ( src) ) ) ,
210209 AstNode :: MacroReflectHash ( type_) => AstNode :: MacroReflectHash ( type_. clone ( ) ) ,
211210 AstNode :: MacroTypeEq ( left, right) => AstNode :: MacroTypeEq ( left. clone ( ) , right. clone ( ) ) ,
212211
@@ -1636,29 +1635,6 @@ impl<'a> Typesys<'a> {
16361635 return Ok ( Type :: ptr_of ( operand_type) ) ;
16371636 }
16381637
1639- // 处理不安全取地址运算符 @unsafe_la
1640- if op == ExprOp :: UnsafeLa {
1641- // 检查是否是字面量或函数调用
1642- if matches ! ( operand. node, AstNode :: Literal ( ..) | AstNode :: Call ( ..) ) {
1643- return Err ( AnalyzerError {
1644- start : operand. start ,
1645- end : operand. end ,
1646- message : "cannot safe load address of an literal or call" . to_string ( ) ,
1647- } ) ;
1648- }
1649-
1650- // 检查是否是联合类型
1651- if matches ! ( operand_type. kind, TypeKind :: Union ( ..) ) {
1652- return Err ( AnalyzerError {
1653- start : operand. start ,
1654- end : operand. end ,
1655- message : "cannot safe load address of an union type" . to_string ( ) ,
1656- } ) ;
1657- }
1658-
1659- return Ok ( Type :: ptr_of ( operand_type) ) ;
1660- }
1661-
16621638 // 处理解引用运算符 *
16631639 if op == ExprOp :: Ia {
16641640 // 检查是否是指针类型
@@ -2579,10 +2555,6 @@ impl<'a> Typesys<'a> {
25792555 * target_type = self . reduction_type ( target_type. clone ( ) ) ?;
25802556 Ok ( Type :: new ( TypeKind :: Int ) )
25812557 }
2582- AstNode :: MacroUla ( src) => {
2583- let src_type = self . infer_right_expr ( src, Type :: default ( ) ) ?;
2584- return Ok ( Type :: ptr_of ( src_type) ) ;
2585- }
25862558 AstNode :: New ( type_, properties, expr_option) => {
25872559 * type_ = self . reduction_type ( type_. clone ( ) ) ?;
25882560
@@ -3578,57 +3550,43 @@ impl<'a> Typesys<'a> {
35783550
35793551 fn self_arg_rewrite ( & mut self , type_fn : & TypeFn , self_arg : & mut Expr ) -> Result < ( ) , AnalyzerError > {
35803552 let self_param_type = & type_fn. param_types [ 0 ] ;
3581- let extract_self_type = if matches ! ( self_param_type. kind, TypeKind :: Ref ( _) | TypeKind :: Ptr ( _) ) {
3582- match & self_param_type. kind {
3583- TypeKind :: Ref ( value_type) | TypeKind :: Ptr ( value_type) => value_type. as_ref ( ) ,
3584- _ => unreachable ! ( ) ,
3585- }
3586- } else {
3587- self_param_type
3588- } ;
3589-
3590- if extract_self_type. is_stack_impl ( ) {
3591- if matches ! ( self_param_type. kind, TypeKind :: Ref ( _) ) {
3592- if matches ! ( self_arg. type_. kind, TypeKind :: Ptr ( _) ) {
3593- return Err ( AnalyzerError {
3594- start : self_arg. start ,
3595- end : self_arg. end ,
3596- message : format ! ( "type mismatch: method requires '{}' receiver, got '{}'" , self_param_type, self_arg. type_) ,
3597- } ) ;
3598- }
3599-
3600- if !matches ! ( self_arg. type_. kind, TypeKind :: Ref ( _) ) {
3601- let mut new_arg = self_arg. clone ( ) ;
3602- new_arg. node = AstNode :: Unary ( ExprOp :: SafeLa , Box :: new ( self_arg. clone ( ) ) ) ;
3603- new_arg. type_ = Type :: ref_of ( self_arg. type_ . clone ( ) ) ;
3604- new_arg. target_type = Type :: default ( ) ;
3605- * self_arg = new_arg;
3606- }
3607- } else if matches ! ( self_param_type. kind, TypeKind :: Ptr ( _) ) {
3608- if matches ! ( self_arg. type_. kind, TypeKind :: Ptr ( _) | TypeKind :: Ref ( _) ) {
3609- return Ok ( ( ) ) ;
3610- }
3611-
3612- let mut new_arg = self_arg. clone ( ) ;
3613- new_arg. node = AstNode :: Unary ( ExprOp :: La , Box :: new ( self_arg. clone ( ) ) ) ;
3614- new_arg. type_ = Type :: ptr_of ( self_arg. type_ . clone ( ) ) ;
3615- * self_arg = new_arg;
3616- } else {
3617- if matches ! ( self_arg. type_. kind, TypeKind :: Ptr ( _) | TypeKind :: Ref ( _) ) {
3618- let mut new_arg = self_arg. clone ( ) ;
3619- new_arg. node = AstNode :: Unary ( ExprOp :: Ia , Box :: new ( self_arg. clone ( ) ) ) ;
3620- new_arg. type_ = Type :: default ( ) ;
3621- * self_arg = new_arg;
3622- }
3623- }
3624- } else {
3625- if !self_arg. type_ . is_heap_impl ( ) {
3553+ if matches ! ( self_param_type. kind, TypeKind :: Ref ( _) ) {
3554+ if matches ! ( self_arg. type_. kind, TypeKind :: Ptr ( _) ) {
36263555 return Err ( AnalyzerError {
36273556 start : self_arg. start ,
36283557 end : self_arg. end ,
3629- message : format ! ( "unsupported method receiver type '{}', expected heap-allocated type" , self_arg. type_) ,
3558+ message : format ! ( "type mismatch: method requires '{}' receiver, got '{}'" , self_param_type , self_arg. type_) ,
36303559 } ) ;
36313560 }
3561+
3562+ if matches ! ( self_arg. type_. kind, TypeKind :: Ref ( _) ) || self_arg. type_ . is_heap_impl ( ) {
3563+ return Ok ( ( ) ) ;
3564+ }
3565+
3566+ return Err ( AnalyzerError {
3567+ start : self_arg. start ,
3568+ end : self_arg. end ,
3569+ message : format ! ( "type mismatch: method requires '{}' receiver, got '{}'" , self_param_type, self_arg. type_) ,
3570+ } ) ;
3571+ }
3572+
3573+ if matches ! ( self_param_type. kind, TypeKind :: Ptr ( _) ) {
3574+ if matches ! ( self_arg. type_. kind, TypeKind :: Ptr ( _) | TypeKind :: Ref ( _) ) {
3575+ return Ok ( ( ) ) ;
3576+ }
3577+
3578+ let mut new_arg = self_arg. clone ( ) ;
3579+ new_arg. node = AstNode :: Unary ( ExprOp :: La , Box :: new ( self_arg. clone ( ) ) ) ;
3580+ new_arg. type_ = Type :: ptr_of ( self_arg. type_ . clone ( ) ) ;
3581+ * self_arg = new_arg;
3582+ return Ok ( ( ) ) ;
3583+ }
3584+
3585+ if matches ! ( self_arg. type_. kind, TypeKind :: Ptr ( _) | TypeKind :: Ref ( _) ) {
3586+ let mut new_arg = self_arg. clone ( ) ;
3587+ new_arg. node = AstNode :: Unary ( ExprOp :: Ia , Box :: new ( self_arg. clone ( ) ) ) ;
3588+ new_arg. type_ = Type :: default ( ) ;
3589+ * self_arg = new_arg;
36323590 }
36333591
36343592 Ok ( ( ) )
0 commit comments